這樣的重複定義?
ld 有 --warn-common 可用。 如果用gcc做連接, 用 -wl,--warn-common。 這
是例子。
a1.c:
#include <stdio.h>
#include <stdlib.h>
int g_this_symbol;
void foo(void);
int
main (int argc, char **argv)
{
g_this_symbol = 99;
foo();
exit(0);
}
b1.c:
#include <stdio.h>
#include <stdlib.h>
/*extern*/ int g_this_symbol;
void foo(void)
{
printf("the value is %d\n", g_this_symbol);
}
gcc -Wall -g -O0 -c -o b1.o b1.c
gcc -Wl,--warn-common -o a1 a1.o b1.o
b1.o: warning: multiple common of `g_this_symbol'
a1.o: warning: previous common is here
正確用法是在一個文件中聲明一個全局變量,其它文件如果要引用到該全局變量,應該添加 extern 描述。
另外,說一下common variables 的概念。 如果在C文件裏, 變量申明在所有函數體的外面, 即沒有static 也沒有 extern 限定符, 也沒有初始化;或是在彙編文件裏,有.comm 或 .lcomm 修飾的變量,在編譯成模塊的時候,它們會放在一個叫做COMMON 的段裏, 最後由連接器決定最終它們放在哪個段裏。