我想了解外部联系和内部联系及其区别。
我还想知道
const variables internally link by default unless otherwise declared as extern.
正如Dudewat所说,外部链接意味着符号(函数或全局变量)可以在整个程序中访问,而内部链接意味着只能在一个翻译单元中访问。
您可以使用extern和static关键字显式控制符号的链接。如果未指定链接,则默认链接为extern,对于非const符号为extern,对于const符号为static(内部)。
// in namespace or global scope
int i; // extern by default
const int ci; // static by default
extern const int eci; // explicitly extern
static int si; // explicitly static
// the same goes for functions (but there are no const functions)
int foo(); // extern by default
static int bar(); // explicitly static
注意,不要使用static进行内部链接,最好使用匿名名称空间,也可以将classes放入其中。在C++ 98和C++ 11之间,匿名命名空间的链接已经发生了变化,但主要的原因是它们无法从其他翻译单元访问。
namespace {
int i; // external linkage but unreachable from other translation units.
class invisible_to_others { };
}
"export"关键字的实现突出显示了声明为"static"的函数与未命名命名空间中声明的函数之间的差异。为了尽我所能总结,在一个翻译单元中用export关键字声明的函数模板可以引用在不同翻译单元的未命名命名空间中定义的函数,这是两阶段查找的结果。(ddj.com/showArticle.jhtml)是否文章ID=184401584)
如果我这样做:1.cpp const int ci;2.cpp extern const int ci;。
@Rajenda您将收到一个未解决的符号错误(抱歉,我错过了这条评论,9个月的答复延迟)。
感谢您提到匿名命名空间。我以前没有意识到这个功能!
信息可能会大大提高这个答案:1)静态不再被禁止在C++ 11中。2)C++ 11中的匿名命名空间成员在默认情况下具有内部链接。参见stackoverflow.com/questions/10832940/…
@克劳姆,谢谢,我没有注意到标准的变化,我取消了索赔。您是否有一个引用建议使用static而不使用未命名的命名空间?
@莫蒂,我没那么说。我也认为这是另一种方式。据我所知,委员会首先否决了static,然后有理由保留我不知道的静态名称空间;匿名名称空间更容易被取消,但我对此没有任何来源。
@Klaim,好的,我会说的,谢谢你的意见。
@ Richard Corden:在C++ 11中,关键字"导出"被认为是被弃用的。
@切口:是的-很好。这一变化更为显著。C++ 11已经改变了一个未命名命名空