2013-12-15 56 views
3

在一个文件中声明一个变量为静态并在另一个文件中做一个extern声明 - 我认为这会在链接时给出错误extern变量不会在任何对象中看到,因为在其他文件中声明的那个变量是静态的。但不知何故链接器(瑞萨)没有显示任何错误并创建了可执行文件。同名两个静态变量(两个不同的文件)和extern其中一个在任何其他文件

如果上面的用例是正确的,如果2个变量在2个不同的文件中被声明为静态,另一个在另一个文件中用extern声明,会发生什么?在这种情况下,将在2个不同的对象中创建2个不同的内存,但其中一个变量将被链接到其他变量在另一个文件中声明为extern(因为两个变量名都相同)??

file1.c中

static int test_var; 
fn1() 
{ 
    test_var = 1; 
}  

file2.c中

static int test_var; 
fn2() 
{ 
    test_var = 2; 
} 

file3.c中

extern int test_var; 
fn3() 
{ 
    int x; 
    x = test_var; 
} 
+0

因此显示实际的代码。 – 2013-12-15 14:08:05

+0

@ H2CO3,样本代码已更新... – Opener

+2

'test_var'没有定义声明'extern',并且没有'main'的定义。我的链接器标记了两个错误。请显示_complete_示例。 –

回答

1

答案可能是你配置好链接器的方式。如果你正在链接库,在这里一切都会好的,file3.o模块将有test_var参考为UNDEFINED

如果您将应用程序从这3个模块链接起来,您将失败,仅仅因为没有main()例程定义和未解决的外部问题将被视为更加恶意。 :-)

只需检查它,请在您的构建过程中检查相应的*.o模块符号表,然后再查看最终结果。有了这样的方法,你会发现你奇怪的构建行为的原因。

4

在你的榜样,file3.c绝对可变test_var没有获得在任file1.c o r file2.c。如果test_var没有在file3.c范围内声明,则应该会出现链接错误。

1

在file1.c和file2.c中,关键字static表示变量test_var文件范围。这意味着这个变量只能在声明它的文件中访问。

在file3.c中,关键字extern表示变量在其他文件中声明。

当编译器编译file3.c时,它会标记变量test_var在其他目标文件中,并且不关心它在哪里。所以这个文件可以被编译,并且没有发生错误。 但是当链接器处理这个目标文件时,它会发现没有名为test_var的变量可以链接到file3,将会显示一个错误。

+0

'static'意味着静态链接,而不是文件范围,'file3.c'中的'extern'声明意味着有一个该变量在其他地方定义,声明已经存在。 – effeffe

+0

@effeffe对于我的错误,我很抱歉,我再次阅读ISO文档,您是对的。 – MicroAleX

相关问题