我想知道以下场景中的行为: –
//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.