草庐IT

c++ - extern 和 extern "C"用于变量

我正在编写供C程序使用的C++共享库。但是,我对extern和extern"C"有疑问。考虑以下代码我的头文件是这样的:#ifdef__cplusplusextern"C"intglobal;extern"C"intaddnumbers(inta,intb);#elseexternintglobal;#endif这很好用;我只需要声明intglobal;在我的.cpp或我的.c文件中。但是,我不明白的是:extern"C"和extern有什么区别?我尝试注释掉extern"C"intglobal并且有效!为什么?我知道extern"C"用于建立C链接。这就是为什么我有extern"C"

c++ - 当应用于命名空间范围内的类时,静态意味着什么?

我知道命名空间范围内的static表示“内部链接”。现在考虑以下代码:staticclassFoo{}foo;static是否适用于Foo、foo或两者? 最佳答案 它适用于在类定义之后声明的变量。在C++中,没有staticclass这样的东西。只有static对象和static函数。 关于c++-当应用于命名空间范围内的类时,静态意味着什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/que

c++ - 模板外部链接?谁能解释一下?

Atemplatenamehaslinkage(3.5).Anon-memberfunctiontemplatecanhaveinternallinkage;anyothertemplatenameshallhaveexternallinkage.Entitiesgeneratedfromatemplatewithinternallinkagearedistinctfromallentitiesgeneratedinothertranslationunits.我知道使用关键字的外部链接extern"C"例如:extern"C"{templateclassX{};}但是他们给了模板不得有

c++ - C++中extern "C"有什么作用?

将extern"C"放入C++代码中究竟有什么作用?例如:extern"C"{voidfoo();} 最佳答案 extern"C"使C++中的函数名称具有C链接(编译器不会破坏名称),以便客户端C代码可以使用C兼容header链接(使用)您的函数只包含函数声明的文件。您的函数定义包含在二进制格式中(由您的C++编译器编译),然后客户端C链接器将使用C名称链接到该二进制格式。由于C++具有函数名称的重载而C没有,C++编译器不能仅使用函数名称作为链接的唯一ID,因此它通过添加有关参数的信息来破坏名称。C编译器不需要破坏名称,因为您不能

c++ - 如何修复 -Wsubobject-linkage 警告?

我在clang和VC++中收到编译良好且无警告的代码的gcc警告,因此我假设它是特定于gcc的。这是代码:namespacemyns{usingTokenList=std::vector;usingRuleList=std::vector;usingRulePathPair=std::pair;usingCandidatesCollection=struct{std::maptokens;std::setrules;};classA{private:CandidatesCollection_candidates;};}//namespacemyns警告是:warning:'myns::

c++ - 为什么他们坚持在下面的示例中使用 `extern` 说明符?

[basic.link]/6(我的重点):Thenameofafunctiondeclaredinblockscopeandthenameofavariabledeclaredbyablockscopeexterndeclarationhavelinkage....staticvoidf();staticinti=0;voidg(){externvoidf();//internallinkageinti;//#2ihasnolinkage{externvoidf();//internallinkage[basic.link]/7:...namespaceX{voidp(){q();//

c++ - 相关名称的参数相关查找

Thisdescriptiononcppreference.com说Thelookupofadependentnameusedinatemplateispostponeduntilthetemplateargumentsareknown,atwhichtime[...]ADLexaminesfunctiondeclarationswithexternallinkagethatarevisiblefromeitherthetemplatedefinitioncontextorthetemplateinstantiationcontext.与此相反的是下面的代码片段compilesfine

c++ - 在未命名的命名空间中定义的 C 回调函数?

我有一个使用Cbison解析器的C++项目。当产生式被bison减少时,C解析器使用函数指针结构来调用创建正确AST节点的函数:typedefvoidNode;structActions{Node*(*newIntLit)(intval);Node*(*newAsgnExpr)(Node*left,Node*right);/*...*/};现在,在项目的C++部分,我填充那些指针classAstNode{/*...*/};classIntLit:publicAstNode{/*...*/};extern"C"{Node*newIntLit(intval){return(Node*)ne

c++ - 如果在同一翻译单元中调用函数,为什么需要重定位

所以我有两个文件,一个是我的库,一个是主程序可执行文件。图书馆:staticintinternal1(inta,intb){returna+b;}namespace{intinternal2(inta,intb){returna+b;}}voidexternal2(intqq,intzz){}voidexternal(inta,intb){external2(a,b);internal1(a,b);internal2(a,b);}编译为g++-c-O0-fPIC-olibtest.olibtest.cpp和g++-shared-olibtest.solibtest.o主要程序:exte

c++ - 头文件中的内联函数可以使用具有内部链接的常量吗?

考虑以下代码:constinta=0;conststd::stringb="hi";inlinevoidf_a1(){std::cout假设此代码存在于将包含在多个翻译单元中的头文件中。我对内联函数的理解是它们在每个翻译单元中必须完全相同。我对上面使用的常量的理解是,它们是隐含的static,即内部链接。这意味着每个翻译单元都有自己的拷贝。由于上面的内联函数依赖于这些常量,如果有的话,这些函数中哪些是正确的? 最佳答案 如果包含在多个翻译单元中,则唯一有效的函数是f_a1。相关子句是[basic.def.odr]/6,其中声明inl