如何找出重名的全局變量

如果代碼很複雜,可能會出現不同模塊使用名字相同的全局變量, 如何發現
這樣的重複定義? 
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 的段裏, 最後由連接器決定最終它們放在哪個段裏。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章