如果代码很复杂,可能会出现不同模块使用名字相同的全局变量, 如何发现
这样的重复定义?
ld 有 --warn-common 可用。 如果用gcc做连接, 用 -wl,--warn-common。 这
b1.c:
这样的重复定义?
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 的段里, 最后由连接器决定最终它们放在哪个段里。