2012-01-18 81 views
1

我有一个理论问题。外部静态函数声明是否打破内部链接?

下面是一个例子:

file1.c中

static void foo() 
{ 
    ... 
} 

file2.c中

extern void foo(); 

main() 
{ 
    foo(); 
} 

编译就可以了。

那么,extern打破了静态声明的内部联系?

+0

什么是令人惊讶的你?编译器一次只能在一个编译单元上运行。链接器可能会抱怨。 – 2012-01-18 12:38:19

+0

另外,你的'主'是不正确的。它可以接受任意数量的参数。 – 2012-01-18 12:38:25

+0

你也试过链接程序吗? – nos 2012-01-18 12:39:32

回答

4

理论上只是“编译好”,还是你真的测试过这个?

一个static功能不应该从编译单元外部可见的(C文件,通常情况下),它在。

在不同的编译单元声明同名的函数extern应该不会改变这一点。

确保你真正建立和链接测试程序得当,否则所有你要测试的是,你可以有一个“悬”引用外部符号(在foo功能从2.C参考) 。将2.c编译为可执行文件(即链接它)应该失败。

0

编译应该没问题。如果你也可以链接,你的编译器有问题。

0

快速测试证实预期接头失败(VC++ 2010所明示):引用解析外部符号 “空隙__cdecl FOO(无效)”(FOO @@ YAXXZ):

1> test.obj:错误LNK2019在功能_wmain