我知道(我坚信)变量声明和定义之间的区别。我只是想知道将在哪里(在哪个对象中)定义一个变量,该变量是使用extern链接声明的(在头文件中),并且将此头文件包含在使用该变量的许多源文件中。我提到很少的声明和定义链接找不到有关此的信息。
//globalheader.h//
extern int test_var;
//file1.c//
#include "globalheader.h"
static fn1();
fn1
{
int a;
a = test_var;
}
//file2.c//
#include "globalheader.h"
static fn2();
fn2
{
int b = 1;
test_var = b;
}
在上面的代码中,test_var是使用globalheader.h中的外部链接声明的,该文件包含在file1.c和file2.c中。没有在哪里定义并使用此test_var,那么该test_var将在哪里(在哪个目标文件中)分配内存?
您的test_var
位置未定义,因此它不会存在于任何目标文件中,并且会显示链接器错误,指出test_var
如果执行链接会丢失该链接器。
您有责任在一个编译单元中对其进行定义,并且它将在您决定的任何目标文件中进行,并且由链接器最终确定任何内存位置。
请注意,如果您通过优化来编译此特定代码,则编译器可能会发现永远不会调用您的静态函数fn1 / fn2,并完全消除它们,在这种情况下,不会有使用的代码test_var
。
附带说明一下,您可以在几个编译单元中以所谓的临时定义定义变量。另请参阅如何使用extern在源文件之间共享变量?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句