2012-05-17 61 views
2

使用外部链接符号(其他全局命名空间混乱/碰撞)有没有什么缺点?例如,我认为如果我有一个我从来没有调用的函数,如果它有内部链接,编译器可以放弃它,但如果它是外部的,编译器必须将该代码留在内,因为稍后有人可能会链接到它。它是否正确?还有其他的缺点吗?外部链接缺陷

我在问,因为我知道建议使用未命名的命名空间而不是static关键字,但由于未命名的命名空间中的符号仍然具有外部链接,因此它们将遭受上述缺点(如果我对此有所了解),以及所以并不比标准所说的静态功能更好。

回答

2

未命名名称空间中的函数具有外部链接的事实几乎完全是一个技术问题。因为它们具有“秘密”翻译单元从属唯一标识符,所以不可能从不同的翻译单元命名它们。这意味着编译器可以假定它们从来不会被其他翻译单元的名称调用。我知道的大多数实现都是在未命名的名称空间中使用本地符号而不是全局符号,就像具有真正内部链接的函数一样。

未命名的命名空间中的函数可以在不影响程序的情况下被丢弃,如果它永远不会从定义它的翻译单元调用,并且它永远不会获取其地址并将其从可能导致该地址的翻译单元中取出被称为除直接命名函数调用以外的其他函数。

+0

*未命名的命名空间中的函数可以被丢弃而不影响程序* - 是,但是它?你知道编译器实际上是这样吗? – baruch

+0

@baruch:是的,gcc在优化级别> ='-O1'处执行此操作。 –