为什么要防止名称重整 C 文件

Why prevent Name-mangling C files

本文关键字:文件 为什么      更新时间:2023-10-16

注意:我的问题据我所知,我没有试图解决特定问题。

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

#ifdef __cplusplus
extern "C" {
#endif

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

2-如果您有+500 C文件的库。(标头 + C 文件)。你如何自动将这个外部"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"的意思是"编译为 C 代码"。事实并非如此。它的意思是,"编译此C++代码,使其外部接口与 C 兼容"。您仍然可以在内部获得所有C++功能。

[附加答案]

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

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

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

相关文章: