2009-07-08 44 views
1

正如我理解函数级链接构建(显式或不是)所有可能的调用的图形,并且只包含可到达函数的代码到生成的二进制文件中。但它如何处理在文件级声明的变量?函数级链接如何处理在文件级声明的变量?

说我有

MyClass GlobalVariable; 
static MyClass StaticGlobalVariable; 

中只包含这两个变量和一组功能实际上没有从任何剩余的代码名为某些文件。

将这些变量分配/初始化的代码包含在输出中吗?

回答

1

从以往的经验(而不是引用标准):

如果initilaization有明显的副作用,如电话接入外部库或文件I/O,初始化总是会发生。

boost::singleton_default提供仅当对象被其他部分所引用时,即当由链接器被删除到对象的所有其它参考文献,初始化被移除,也要做强制执行初始化一个有趣的解决方案。

0

编辑:是的。 g ++优化标志试图找出函数调用并删除导致链接器错误的.o文件。我不确定这是否只发生在某些优化标志上,但确实发生了。

我们公司的坏习惯是在不同的文件中出现了很多'extern g_GlobalFunction()'的定义。由于它们的调用取决于条件代码,因此.o文件经常被丢弃,导致链接错误。

我们固定与g_InitModule()和g_InitFileName()被称为从主分层起()的调用。大多数情况下,这些都是空的函数,只是为了劝阻g ++放弃.o文件。