2

使用带有外部链接的符号(除全局命名空间混乱/冲突之外)有什么缺点吗?例如,我会认为如果我有一个我从不调用的函数,如果它有内部链接,编译器可以丢弃它,但如果它是外部的,编译器必须保留该代码,因为稍后有人可能会链接到它. 它是否正确?还有其他缺点吗?

我问是因为我知道推荐使用未命名的命名空间而不是 static 关键字,但是由于未命名命名空间中的符号仍然具有外部链接,因此它们会遭受上述缺点(如果我是对的),因此并不完全比标准所说的静态函数更好。

4

1 回答 1

2

未命名命名空间中的函数具有外部链接这一事实几乎完全是技术性的。因为它们有一个“秘密”翻译单元依赖的唯一标识符,所以不可能从不同的翻译单元命名它们。这意味着编译器可以假定它们永远不会被另一个翻译单元按名称调用。我知道的大多数实现将未命名命名空间中的函数转换为局部符号而不是全局符号,就像具有真正内部链接的函数一样。

一个未命名命名空间中的函数可以被丢弃而不影响程序,如果它从未从定义它的翻译单元中调用,并且它的地址从未被获取并传递出翻译单元,这可能导致它被调用,而不是是直接命名的函数调用。

于 2012-05-17T12:30:16.580 回答