時警告或錯誤假設下面的代碼:GCC沒有定義一個局部變量多次
交流:
#include <stdio.h>
int a;
int func();
int main(int argc, char **argv) {
a = 7;
int a2 = func();
printf("a is %d, a2 is %d\n", a, a2);
return 0;
}
和BC:
int a;
int func()
{
a = 9;
return a;
}
當g++ a.c b.c -Wall -O0
編譯它產生鏈接錯誤,如預期。但是,在調用gcc a.c b.c -Wall -O0
時,它不會產生警告並且不會出現錯誤!順便說一句,
輸出是a is 9, a2 is 9
。
gcc版本5.4.0 20160609(Ubuntu的5.4.0-6ubuntu1〜16.04.4)
爲什麼GCC允許這樣做? 我對這種行爲感到驚訝。如果你在聲明時初始化變量,那麼GCC也會失敗。
嘗試在*相同*文件中定義兩次。你會感到驚訝。 http://en.cppreference.com/w/c/language/extern –
複製直到鏈接器才顯示出來,並且由於沒有引用'a'的* external *實例,所以重複定義不被注意並被忽略。 – Mike
這是本週早些時候由別人提出的問題([爲什麼這個程序沒有錯誤?](https://stackoverflow.com/questions/42215669/))。這被封閉爲[C99中的暫時定義和鏈接](https://stackoverflow.com/questions/1490693/)的副本。它已經在[如何使用'extern'在C源代碼文件之間共享變量?](https://stackoverflow.com/questions/1433204/) –