c – 在so库中使用相同名称定义的全局变量

我想知道以下场景中的行为: –

//file1.c : Main file of a user-space process,say Process X.
int a; //GLobal variable in file1.c
func(); //Library function

//file2.c :Part of .so used by Process X.
int a;
void func()
{
    a=0;//Access variable a.
}

如果进程X调用库的函数func(),会发生什么?

最佳答案 在file1.c中,您已定义

int a;

它告诉编译器为该编译单元中的a分配内存,所有对a的引用都将由编译器(而不是链接器)解析.所以file1看到了自己的a,而file1看到了自己的a.如果您有,请使用

extern int a;

在file1中,编译器会将此符号的解析推迟到链接器,然后将在file2.c之外解析.

由于file2是一个共享对象,如果变量a应该被其他文件使用,那么file2.so可能会附带一个file2.h,它会有一行

extern int a;

然后这个file2.h将在file1.c中被#included.

点赞