我最近在阅读StroustrupsTheC++ProgrammingLanguage,在第9章有关Linkage的部分中,我看到了以下段落:"InCandolderC++programs,thekeywordstaticis(confusingly)usedtomean"useinternallinkage".Don'tusestaticexceptinsidefunctionsandclasses."问题是进一步阅读,作者没有详细说明为什么这是不好的做法。我不时在我的代码中使用静态函数,通常是为了一些在编译单元之外不需要的简单计算,但我从来没有意识到这是不受欢迎的,而且我也不清楚为什
如果我将函数设为内联,它是否会将其链接更改为内部链接?例如:我在两个文件中使用或调用内联函数:file1.cpp//functiondefinitioninlinevoidfoo(){}file2.cpp//functiondefinitioninlinevoidfoo(){}为什么我需要在每个文件中定义内联函数才能调用它?我得到一个内部链接?如果我使用staticinline会怎样? 最佳答案 IfImakeafunctioninlinedoesitchangeitslinkagetointernallinkage?不,将其内联并
ISO98/03标准(第14.3.1节)似乎禁止使用具有内部链接的类型作为模板参数。(参见下面的示例。)C++11标准没有。G++-使用旧标准-允许它。是我误读了03标准,还是g++只是放任自流?namespace{structhidden{};}templatestructS{Tt;};intmain(){Ss;return0;} 最佳答案 你是对的,C++03不允许使用具有内部链接的类型作为模板类型参数,而C++11允许。不过,我似乎记得,匿名命名空间内的定义仍然具有外部链接。是的,第3.5节[basic.link]说Aname
在c++标准[temp.point]中是这样写的:Theinstantiationcontextofanexpressionthatdependsonthetemplateargumentsisthesetofdeclarationswithexternallinkagedeclaredpriortothepointofinstantiationofthetemplatespecializationinthesametranslationunit.然后在[temp.dep.candidate]中:Forthepartofthelookupusingassociatednamespace
我使用g++(7.1)和clang++(xcode9.0)和-std=c++11-Wall编译了以下程序并得到了结果:g++0x10052c0500x10052c0400x10052c040clang++0x108b740240x108b740180x108b74018这意味着externinta[];和staticinta[3];声明相同的实体并具有相同的链接(内部链接)。//a.cpp#includeinta[3];voidf(){printf("%p\n",(void*)a);};//b.cppexternvoidf();staticinta[3];voidg(){printf(
所以我知道在C++中,常量在默认情况下获得与变量不同的链接。这就是为什么我不能放intfoo;在某些header中——链接器会正确地提示multipledefinitions.OTOH,我会写constintbar=42;在header中,编译器确保只有一个bar定义。有了整数常量,很容易看出编译器是如何处理这个问题的——至少只要没有人获取bar的地址或做一些其他需要它为其分配存储空间的有趣事情).但是,如果有人这样做怎么办?如果它不是一个整体而是需要在运行时执行代码的东西怎么办?假设我把它放到标题中:conststd::stringbaz="h2g2";假设没有小字符串优化,这需要在
我有2个文件A.cpp和B.cpp,它们看起来像A.cpp----------classw{public:w();};B.cpp-----------classw{public:w();};现在我在某处(https://en.cppreference.com/w/cpp/language/static)读到类具有外部链接。因此,在构建时我期待一个多重定义错误,但恰恰相反,它像魅力一样工作。但是,当我在A.cpp中定义类w时,出现重定义错误,这让我相信类具有内部链接。我是不是漏掉了什么? 最佳答案 正确答案是肯定的,一个类的名称可能有
block中声明的所有变量是否都“无链接”?例如:1:如果我声明一个静态变量:voidfoo(){staticinti;}它会有内部链接还是没有链接?如果没有链接,那为什么要把它设为静态?2:如果我使用extern会怎样?/*globalscope*/staticinti;voidfoo(){externinti;}在这种情况下,i的链接是什么? 最佳答案 确实,在函数范围内“没有链接”。目标是生命周期管理:静态具有全局静态的生命周期,同时具有全局静态的可见性(作用域)本地。注意在C++中,您还可以通过将静态变量('globals'
请引用以下同翻译单元的代码:staticintglobal_var;//filescopeinCandglobalnamespacescopeinC++//internallinkagevoidf(void){staticintlocal_var;//blockscopeinCandlocalscopeinC++//nolinkage}我的理解是这样的:我可以从翻译单元的任何地方引用global_var,因为它具有全局范围。我只能在函数f中引用local_var,因为它具有局部作用域。我的问题:这两个变量在链式方面有什么区别?您能否提供一个示例,说明内部和无链接会产生差异,并且差异不仅
所以我有一个应用程序可以在Windows、Linux和一些Unix变体上编译得很好。我最近遇到问题时决定将它移植到OSX。我有一个看起来像这样的模板:templateintsafe_ctype(unsignedcharc){returnF(c);}想法是防止符号扩展在给定高于0x7f的输入值时使某些实现崩溃。它通常像这样使用:safe_ctype(ch);不幸的是,这不适用于OSX(使用gcc4.2)。该错误与std::isspace没有外部链接有关,因此不适用于模板。事实证明,在OSX上,ctype.hheader具有标记为staticinline的所有函数(通过宏)。这是我的问题: