草庐IT

c++ - 除了使用 'extern' 关键字 :n3290 draft 之外,是否还有其他可能证明这一点

ISO草案N3290中的一点:非限定名称查找:第3.4.1节,第14段:Ifavariablememberofanamespaceisdefinedoutsideofthescopeofitsnamespacethenanynamethatappearsinthedefinitionofthemember(afterthedeclarator-id)islookedupasifthedefinitionofthememberoccurredinitsnamespace.例如:namespaceN{inti=4;externintj;}inti=2;intN::j=i;//N::j==4

c++ - 在命名空间中包装 extern "C"库时出现问题

我正在使用C++中的C库(libgretl),它的一些函数与我的代码冲突,所以我想将它包装在一个命名空间中,如下所示:namespacelibgretl{extern"C"{#include}}但是,这不会编译,我从gcc文件中得到“未定义”错误(在Windows上使用mingw32和gcc4.5.2)。第一个错误来自文件c++/cstddef的以下代码块:_GLIBCXX_BEGIN_NAMESPACE(std)using::ptrdiff_t;using::size_t;_GLIBCXX_END_NAMESPACE其中宏分别展开为namespacestd{和}。这些之后还有更多错误

c++ - 头文件中的 `static` , `extern` , `const`

//a.hexternintx1;staticintx2;intx3;staticconstintx4;classA{public:staticconstintx5=10;};a.h会被多个.cpp文件包含,我的问题是:1.x1只是一个声明,不是吗?所以它的定义应该在那些.cpp文件之一中完成,对吧?2.x2是一个定义,对吧?我曾经认为staticint和externint一样也是一个声明,但我错了。x2将仅在a.h中可见?3.如果a.h包含在多个.cpp文件中,x3会被定义多次,所以x3会导致编译错误,对吧?4.x4是一个定义,对吧?5.这里在A类中,x5是一个声明,是的。但是x4呢

c++ - 如果嵌套 extern "C"会发生什么?

看起来嵌套extern"C"是合法的。例如:extern"C"extern"C"voidfoo();第二个extern"C"基本上被忽略了。这是由C++标准保证的吗?在哪里? 最佳答案 是的,但它实际上是第一个被忽略的extern"C"。引用标准[dcl.link]:Linkagespecificationsnest.Whenlinkagespecificationsnest,theinnermostonedeterminesthelanguagelinkage. 关于c++-如果嵌套e

c++ - 除了避免 'extern C' 并获得 'C++ exception' 之外,将 Lua 编译为 C++ 有什么好处?

我是Lua的新手,我想使用C++将Lua嵌入到我们的游戏项目中。我注意到的第一件事是,允许将Lua编译为C++代码,并且从文档中,我了解到这将消除环绕Luaheader的“externC”,并且错误处理将是C++异常而不是跳远/定跳。我的问题是,除了这两个区别之外,将Lua代码编译为C++代码还有其他真正的好处吗?这两个并不能真正说服我,因为,1)用'externC'包装cheader并不困扰我,2)我们的项目不允许异常,所以我必须更改luaconf.h才能使用longjump/setjump任何方式。 最佳答案 那些是将Lua编译

c++ - 正确使用 'extern' 关键字

有一些资源(书籍、在线资料)解释了extern的用法,如下所示:externinti;//declaration-has'extern'inti=1;//definition-specifiedbytheabsenceof'extern'并且有支持以下语法的来源:externinti;//declarationexterninti=1;//definition-specifiedbytheequalsign//Bothmarkedwith'extern'我的问题是-这是C与C++的区别,还是pre-ANSI与ANSI练习?现在,更实际的问题:使用第二种语法,我想创建一个全局对象(从每个

c++ - 你如何声明一个 extern "C"函数指针

所以我有这段代码:#include"boost_bind.h"#include#include#includedoublefoo(doublenum,double(*func)(double)){return65.4;}intmain(intargc,char**argv){std::vectorvec;vec.push_back(5.0);vec.push_back(6.0);std::transform(vec.begin(),vec.end(),vec.begin(),boost::bind(foo,_1,log));}并收到此错误:returnunwrapper::unwrap

c++ - #ifdef __cplusplus extern "C"{ #endif 的最佳位置在哪里

我想知道放在哪里比较好#ifdef__cplusplusextern"C"{#endif在C头文件中。在所有其他包含的开头或之后。为什么? 最佳答案 对此没有严格的规定,但要注意以下几点。一般原则是每个头文件都自行处理(并且是自给自足的)。因此,根据这个原则,不需要将头文件包装在extern“C”中,因为头文件中会有一个extern“C”(如果需要的话)。因此,在当前文件中,您可以将它放在其他包含文件之后。但是如果你确实有一大堆标题,你不想添加一个外部“C”,并且想通过一个单独的包含来提供,无论如何,继续把它们包装起来在文件宽外部“

c++ - extern C 不能在类级别使用?

只是想确认在Windows环境下,VSTS2008+C++项目,我们只能将externC应用到函数级别,不能应用到类级别(这样类中的所有成员函数都使用C语言名称修饰)?试了好几种方法,总是编译出错。提前致谢,乔治 最佳答案 您可以通过非常复杂(但完全合法)的hack将extern"C"应用于成员函数:extern"C"typedefintbar_t(intx);structfoo{bar_tbar;//yes,thisdeclaresanonstaticmemberfunction!};intfoo::bar(intx){retur

c++ - 在 block 作用域中使用 extern

clang、gcc和VS2013都提示在main()中重新定义了w,但我在标准中找不到任何不允许这样做的内容。namespaceN{externintj;intj;}intmain(){externintw;intw;}这些段落说明了在block范围内使用extern声明,但它们似乎没有证明错误消息的合理性:§3.3.1/4Givenasetofdeclarationsinasingledeclarativeregion,...[Note:Theserestrictionsapplytothedeclarativeregionintowhichanameisintroduced,whi