c语言外部链接和内部链接,关于c ++:什么是外部链接和内部链接?

本文详细解释了C++中的外部链接和内部链接,包括它们的区别和如何使用`extern`和`static`关键字来控制链接性质。外部链接允许符号在整个程序中访问,而内部链接则限制为单个翻译单元。对于非`const`全局变量,其默认链接为外部,`const`全局变量默认为内部链接。C++ 11中匿名命名空间的成员默认具有内部链接。`static`关键字用于声明内部链接,而`extern`用于声明外部链接。此外,文章还讨论了`const`变量的链接规则以及C++ 11中`static`和匿名命名空间的差异。
摘要由CSDN通过智能技术生成

我想了解外部联系和内部联系及其区别。

我还想知道

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已经改变了一个未命名命名空

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值