注意:我的问题是我的知识,不是试图解决特定的问题。
我当时正在研究在CPP项目中使用C库来防止编译器名称篡改:
#ifdef __cplusplus
extern "C" {
#endif
1-但我也读过,C ++编译器不会破坏.c文件。那为什么要打扰呢?
2-如果您的库包含+500个c文件。 (标头+ C文件)。如何将这个Extern“ C”自动添加到它们中?有没有可以自动执行此过程的工具?
答案 0 :(得分:2)
c++
编译器可能不会对.c
文件进行名称修改,但肯定会修改.cpp
文件所包含的文件,因此在头文件中是必需的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。