为什么要防止 Name-mangling C 文件

Why prevent Name-mangling C files

注意:据我所知,我的问题不是要解决特定问题。

我正在研究在 CPP 项目中使用 C 库来防止编译器名称混淆:

#ifdef __cplusplus
extern "C" {
#endif

1- 但我也读到 C++ 编译器不会破坏 .c 文件。那何必呢?

2- 如果您有一个包含 +500 个 c 文件的库。 (头文件 + c 文件)。您如何将这个 Extern "C" 自动添加到其中?有没有自动执行此过程的工具?

  1. c++ 编译器可能不会对 .c 文件进行名称修改,但它肯定会修改 .cpp 文件中包含的名称,因此在头文件中需要它
  2. 您可以简单地使用 extern "C"{ file content here },这可以在许多工具中轻松完成。

我给你写一个cmd脚本(.bat)

警告:这会覆盖现有文件,进行备份!

@ECHO OFF
for /R %%f in (*.c,*.h) do (
   @echo extern "C" { > temp
   @echo. >> temp
   @type %%f >> temp
   @echo. >> temp   
   @echo } >> temp
   @type temp > %%f
   @echo processed %%f
)

"apple apple"的回答一般都是错误的

C++ 编译器根据定义编译 C++。一些编译器是 C/C++ 编译器,或者支持更多语言(想到 GCC)。这些可能会使用文件扩展名作为线索,但您通常也可以选择一种特定语言。例如。 gcc -x c++ 选择 Gnu C++ 编译器,即使是 .c 文件。

至于现有的 C 库,因为您拥有源文件,所以 不需要 防止名称混淆。使用与您的应用程序相同的编译器编译库。这导致名称修改相同。不需要任何工具。

我还怀疑你可能认为extern "C"意味着"compile as C code"。事实并非如此。这意味着,"compile this C++ code so that its external interface is compatible with C"。您仍然可以获得内部的所有 C++ 功能。

[补充回答]

通常不需要编辑原始文件来添加 extern "C"。有一个更简单的替代方法,可以保持文件不变:

// Foo.cpp
extern "C" {
   #include "Foo.c"
}

您告诉您的 C++ 编译器编译 Foo.cpp。它将首先 运行 预处理器,然后将 Foo.c 插入 extern "C" { } 块。