草庐IT

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++ - 为什么他们坚持在下面的示例中使用 `extern` 说明符?

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

c++ - 外部 "C"时无法使用 cout/endl

我希望有人能帮助我解决这个小问题,因为我一无所获。首先,这里是代码:#include#include#includeusingnamespacestd;extern"C"{#include#include}intmain(){intiQuit;cout它不会让我使用std的东西(即cout、cin、endl等)。只有当我取出所有外部“C”代码时,它才会允许我使用它……这是为什么呢?有办法解决这个问题吗?编辑:抱歉,忘了告诉你确切的错误:它说标识符“cout”未定义谢谢 最佳答案 你的编译环境有问题。该代码没有任何问题。它编译并运行良

c++ - 仅在 header 中的extern变量意外起作用,为什么?

我当前正在更新Arduino的C++库(使用avr-gcc编译的8位AVR处理器)。通常,默认Arduino库的作者喜欢在header中包含该类的extern变量,该变量也在.cpp类文件中定义。我认为基本上是为了让新手能够将所有东西都准备好作为内置对象。我遇到的情况是:我更新的库不再需要.cpp文件,并且已将其从库中删除。直到我进行最后一遍检查发现的错误之后,尽管没有为.cpp文件中的extern变量提供定义的事实,但没有产生链接器错误。这很简单,我可以得到它(头文件):structFoo{voidmethod(){}};externFoofoo;包含此代码并将其用于一个或多个源文件

c++ - 扭曲的逻辑 : a global variable in one file refers to an extern variable but is also referred by that extern variable

文件A.cpp:#includeexternintiA;externintiB=iA;intmain(){std::cout文件B.cppexternintiB;externintiA=2*iB;编译链接运行,out进来debug和release模式是0,0我的问题是它是如何工作的,为什么在链接阶段没有问题?我正在使用VC++2003。 最佳答案 初始化程序覆盖了extern关键字,因此这没有什么“神奇”:您只是在不同的翻译单元中声明和定义两个完全不相关的变量。来自StandardforProgrammingLanguageC++-

c++ - 更好地理解 extern "C"函数

我只是想进一步了解externC函数。据我所知,externC函数始终是您尝试从已编译的应用程序调用的函数。可执行文件、静态或动态库。extern"C"{HRESULTCreateDevice();typedefHRESULT(*CREATEDEVICE)();HRESULTReleaseDevice();typedefHRESULT(*RELEASEDEVICE)();}所以我的问题是...我的理解对吗??它总是必须是C函数指针吗??'为什么必须为每个函数使用typedef??我假设当您使用GetProcAddress()时。您正在为特定应用程序HEAP而不是您从中调用它的应用程序分

c++ - C++ 中的名称重整

我正在浏览这篇文章-http://www.geeksforgeeks.org/extern-c-in-c/给出了两个例子-intprintf(constchar*format,...);intmain(){printf("GeeksforGeeks");return0;}它说这不会编译,因为编译器将无法找到“printf”函数的损坏版本。但是,下面给出了输出。extern"C"{intprintf(constchar*format,...);}intmain(){printf("GeeksforGeeks");return0;}这是因为extern"C"block防止名称被破坏。但是,

C++ 外部 : pointer vs. 引用

我有三个类:ConsoleInputStream、ConsoleOutputStream、ConsoleErrorStream。它们都是从Stream派生的。每个流都有虚函数read和write;如您所料,当用户尝试使用ConsoleInputStream的write成员函数时,它会抛出一个错误。当用户尝试使用ConsoleOutputStream的write函数时,也会发生同样的情况。现在是显示代码的时候了。//STREAM.HPPnamespacestreamlib{externConsoleInputStreamstdin_default;externConsoleOutputS

c++ - 为什么需要在初始化时指定外部/静态变量的类型?

我不明白在初始化时需要指定外部/静态变量的类型。例如:structTest{staticinti;};Test::i=2;//errorintTest::i=2;//ok难道编译器不知道我是int类型的吗?这只是编译器的特殊性,还是为什么需要类型int的规范? 最佳答案 Idonotunderstandtheneedtospecifythetypeofanextern/staticvariableatinitialization.因为语言设计者选择对变量声明和定义使用相同的语法。该语法包括类型名称。您是对的,在某些情况下,该类型名称

c++ - 静态类变量是否与外部变量相同,仅具有类范围?

在我看来,静态类变量与外部变量相同,因为您只在staticintx/externintx中声明它语句,并实际在别处定义它(通常在.cpp文件中)静态类变量//.hfileclassFoo{staticintx;};//.cppfileintMyClass::x=0;外部变量://.hfileexterninty;//.cppfileinty=1;在这两种情况下,变量都在某处声明一次,并在一个文件中定义,该文件不会在编译中多次包含(否则链接器错误) 最佳答案 是的,两者都有静态存储时长和外部链接;它们具有基本相同的运行时属性,只是(编