将extern"C"放入C++代码到底有什么作用?例如:extern"C"{voidfoo();} 最佳答案 extern"C"使C++中的函数名具有C链接(编译器不会破坏名称),以便客户端C代码可以使用C兼容header链接到(使用)您的函数仅包含函数声明的文件。您的函数定义包含在二进制格式(由您的C++编译器编译)中,然后客户端C链接器将使用C名称链接到该格式。由于C++有函数名重载,而C没有,C++编译器不能只使用函数名作为链接的唯一id,因此它通过添加有关参数的信息来破坏名称。C编译器不需要修改名称,因为您不能在C中重载函数
这是ananswer的后续问题。至Isitpossibletotypedefapointer-to-extern-“C”-functiontypewithinatemplate?此代码无法使用g++、VisualC/C++和ComeauC/C++编译,错误消息基本相同:#includeextern"C"{staticintdo_stuff(int){return3;}templatestructtest{staticvoidfoo(return_t_(*)(arg1_t_)){}};}intmain(){test::foo(&do_stuff);returnEXIT_SUCCESS;}
这是ananswer的后续问题。至Isitpossibletotypedefapointer-to-extern-“C”-functiontypewithinatemplate?此代码无法使用g++、VisualC/C++和ComeauC/C++编译,错误消息基本相同:#includeextern"C"{staticintdo_stuff(int){return3;}templatestructtest{staticvoidfoo(return_t_(*)(arg1_t_)){}};}intmain(){test::foo(&do_stuff);returnEXIT_SUCCESS;}
这段代码编译得很好:externinti=10;voidtest(){std::cout虽然这段代码给出了错误:voidtest(){externinti=10;std::couterror:'i'hasboth'extern'andinitializer我在C++Primer中读到了这篇文章:Anydeclarationthatincludesanexplicitinitializerisadefinition.Wecanprovideaninitializeronavariabledefinedasextern,butdoingsooverridestheextern.Anexte
这段代码编译得很好:externinti=10;voidtest(){std::cout虽然这段代码给出了错误:voidtest(){externinti=10;std::couterror:'i'hasboth'extern'andinitializer我在C++Primer中读到了这篇文章:Anydeclarationthatincludesanexplicitinitializerisadefinition.Wecanprovideaninitializeronavariabledefinedasextern,butdoingsooverridestheextern.Anexte
这个问题在这里已经有了答案:Whatistheeffectofextern"C"inC++?(16个答案)关闭8年前.也许我不了解C和C++之间的区别,但我们何时以及为什么需要使用extern"C"{?显然它是一个“链接约定”。我简要地阅读了它,并注意到MSVS中包含的所有.h头文件都用它包围了它们的代码。究竟什么类型的代码是“C代码”而不是“C++代码”?我以为C++包含所有C代码?我猜测情况并非如此,C++是不同的,标准特性/功能存在于其中一个或另一个但不是两者都存在(即:printf是C,cout是C++),但C++是倒退的通过外部“C”声明兼容。这是正确的吗?我的下一个问题取决
这个问题在这里已经有了答案:Whatistheeffectofextern"C"inC++?(16个答案)关闭8年前.也许我不了解C和C++之间的区别,但我们何时以及为什么需要使用extern"C"{?显然它是一个“链接约定”。我简要地阅读了它,并注意到MSVS中包含的所有.h头文件都用它包围了它们的代码。究竟什么类型的代码是“C代码”而不是“C++代码”?我以为C++包含所有C代码?我猜测情况并非如此,C++是不同的,标准特性/功能存在于其中一个或另一个但不是两者都存在(即:printf是C,cout是C++),但C++是倒退的通过外部“C”声明兼容。这是正确的吗?我的下一个问题取决
有什么办法,除了在每个函数原型(prototype)上放置一个属性,让gcc知道C函数永远不会传播异常,即在extern"C"中声明的所有函数都应该是__attribute__((nothrow))?理想的是-f风格的命令行选项。 最佳答案 您始终可以使用-fno-exceptions,这将确保c++编译器不会生成异常传播代码。 关于c++-是否有一个gcc选项来假设所有extern"C"函数不能传播异常?,我们在StackOverflow上找到一个类似的问题:
有什么办法,除了在每个函数原型(prototype)上放置一个属性,让gcc知道C函数永远不会传播异常,即在extern"C"中声明的所有函数都应该是__attribute__((nothrow))?理想的是-f风格的命令行选项。 最佳答案 您始终可以使用-fno-exceptions,这将确保c++编译器不会生成异常传播代码。 关于c++-是否有一个gcc选项来假设所有extern"C"函数不能传播异常?,我们在StackOverflow上找到一个类似的问题:
我正在尝试创建一个导出名为“GetName”的函数的DLL。我希望其他代码能够调用此函数而不必知道损坏的函数名称。我的头文件是这样的:#ifdef__cplusplus#defineEXPORTextern"C"__declspec(dllexport)#else#defineEXPORT__declspec(dllexport)#endifEXPORTTCHAR*CALLBACKGetName();我的代码如下所示:#include#include"PluginOne.h"intWINAPIDllMain(HINSTANCEhInstance,DWORDfdwReason,PVOID