如何找出重名的全局变量

如果代码很复杂,可能会出现不同模块使用名字相同的全局变量, 如何发现
这样的重复定义? 
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);
}


如果b1.c不声明g_this_symbol 为extern, 连接的时候会报警:

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 的段里, 最后由连接器决定最终它们放在哪个段里。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值