导出符号时是否必须指定extern“C”?

时间:2011-03-27 09:13:55

标签: windows winapi visual-c++

我想知道extern“C”是否是必须的?

3 个答案:

答案 0 :(得分:8)

只有你想从C(或不同的C ++编译器,你应该像C一样对待)调用你的代码。

禁用name-mangling

请参阅有关C ++常见问题的文章:http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html

答案 1 :(得分:1)

不,您使用extern "C"为您的C ++函数提供C链接,因此它们不会像普通C ++函数那样“修饰”并允许从C(或Objective-C)调用它们)。

函数修饰用于实现C ++ function overloading功能,并为函数的每个变体提供不同的签名,同时允许开发人员使用他指定的名称。

只需不使用static关键字即可自动导出您的C ++函数。但是,如果您在Windows DLL中实现了C ++函数,则必须使用declspec dllexport/dllimport关键字在外部访问它们。

答案 2 :(得分:1)

使用extern "C"关闭名称修改。如果你不这样做,你可能会为你的DLL客户端输入你的符号而努力。

请记住,不同的C ++编译器具有不同的名称修改规则,因此您的错位导出名称可能与导入时使用的名称不同。

但是,如果使用与DLL不同的编译器从DLL导入类是错误的,那么这是一个没有实际意义的点。

所以,如果你要导出类(反正通常是一个坏主意),那么更容易留下错误。否则,请使用extern "C"将其关闭。