我想了解以下情况中的行为: -
//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()
,会发生什么?
答案 0 :(得分:2)
在file1.c
已定义
int a;
告诉编译器在该编译单元中为a
分配内存,所有对a
的引用都将由编译器解析(并且 not 链接器)。因此,file1
会看到自己的a
和file1
看到自己的a
。如果您有,请使用
extern int a;
在file1
中,编译器会将此符号的解析推迟到链接器,然后a
将在file2.c
之外解析。
由于file2
是共享对象,如果变量a
应该由其他文件使用,那么file2.so
可能会附带{{ 1}},这将有行
file2.h
然后extern int a;
file2.h
将#include
{/ 1}}。
答案 1 :(得分:0)
进行测试。很容易。
in file2与func链接,因此in file1不会受到影响。它们是两个不同的变量。