識別符號的連結不一致
extern int var;
static int var; /* Undefined behaviour */
C11,§6.2.2,7 說:
如果在翻譯單元內,同一識別符號同時出現內部和外部連結,則行為未定義。
請注意,如果識別符號的先前宣告是可見的,那麼它將具有先前宣告的連結。 C11,§6.2.2,4 允許它:
對於在儲存類規範外部宣告的識別符號,在該範圍內可以看到該識別符號的先前宣告,31)如果先前宣告指定內部或外部連結,則後面宣告中識別符號的連結與在先前宣告中指定的聯絡。如果沒有先前的宣告可見,或者如果先前的宣告沒有指定連結,則識別符號具有外部連結。
/* 1. This is NOT undefined */
static int var;
extern int var;
/* 2. This is NOT undefined */
static int var;
static int var;
/* 3. This is NOT undefined */
extern int var;
extern int var;