将标题中的"extern"C"'声明为C++共享库的影响是什么?

Ada*_*erg 6 c c++ linux shared-libraries extern

基于这个问题,我理解了将C库与C++代码链接起来的构造的目的.现在假设如下:

我有一个用C++编译器编译的'.so'共享库.标题有一个'typedef stuct'和许多函数声明.如果标题包含extern"C"声明......

#ifdef __cplusplus
extern "C"
{
#endif

  // typedef struct ...;
  // function decls

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

......有什么影响?具体来说,我想知道该声明是否存在任何有害的副作用,因为共享库被编译为C++,而不是C.

在这种情况下,有没有理由有外部"C"声明?

Ste*_*hen 12

这很重要,因此编译器不会命名mangle.C++使用名称修改来区分具有运算符重载的函数.

对二进制文件运行"/ usr/bin/nm"以查看C++对函数名称的作用:_ZSt8_DestroyIN9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEEiEvT_S7_SaIT0_E

extern"C"阻止该名称变形.

IIRC,使程序可以在运行时动态链接符号.这对于"插件"类型的体系结构来说很常见.


Dro*_*per 5

编译 C++ 时,方法名称会发生​​变化(修改) - 您将无法从另一个使用 C 的 dll/exe 调用该方法。

为了保留类和方法的名称,您需要将它们编译为“C”而不进行名称修饰。

该库仍然是一个 C++ 库,但它将其一些声明(extern "c" 块中的声明)公开为 C 方法。