为什么要防止名称混乱的C文件

时间:2019-01-15 06:02:59

标签: c++ c linker name-mangling

注意:我的问题是我的知识,不是试图解决特定的问题。

我当时正在研究在CPP项目中使用C库来防止编译器名称篡改:

#ifdef __cplusplus
extern "C" {
#endif

1-但我也读过,C ++编译器不会破坏.c文件。那为什么要打扰呢?

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

3 个答案:

答案 0 :(得分:2)

  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
)

答案 1 :(得分:1)

“苹果苹果”的答案通常是错误的。

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

对于现有的C库,由于具有源文件,因此不需要来防止名称修改。使用与应用程序相同的编译器来编译库。这导致名称改写是相同的。无需工具。

我还怀疑您可能认为extern "C"的意思是“编译为C代码”。事实并非如此。这意味着“编译此C ++代码,使其外部接口与C兼容”。您仍然可以在内部获得所有C ++功能。

答案 2 :(得分:1)

[其他答案]

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

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

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