識別符號的連結不一致

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;