为什么要防止名称重整 C 文件
Why prevent Name-mangling C files
注意:我的问题据我所知,我没有试图解决特定问题。
我正在研究在 CPP 项目中使用 C 库来防止编译器名称重整:
#ifdef __cplusplus
extern "C" {
#endif
1-但我也读到C++编译器不会破坏.c文件。 那何必呢?
2-如果您有+500 C文件的库。(标头 + C 文件)。你如何自动将这个外部"C"添加到其中?有没有自动化此过程的工具?
-
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
)
"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" { }
块中。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么在某些情况下不写入此文件?
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 为什么您需要C++头文件的包含保护
- 为什么C++的文件 I/O 在读取文本文件时忽略初始空行?我怎样才能让它不这样做?
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 库标题在标题中不可见,但在 cmake build 下.cpp文件中完全可见.为什么?
- 为什么我的 heap.h 文件给我一个LNK2001错误?
- 为什么make_optional不适用于文件流?
- 为什么文件不是由 F 流创建的,或者即使它是输出只是垃圾值?
- 为什么当我输入较大的数字时,我的程序会到达文件末尾?
- 为什么 getline() 不读取文本文件中的所有内容?
- 为什么我无法打开/读取从 Python 调用的 C 扩展名中的 txt 文件?
- 数据文件处理中的错误检查是否可以打开文件 - 为什么会发生
- 尽管模板是静态绑定的,但旧代码的对象文件为什么以及如何使用使用通用编程范式的新代码
- 可视C++程序崩溃,但未生成转储文件.为什么
- 启动失败.找不到二进制文件.为什么
- 创建文件2、读取文件和写入文件;为什么 ReadFile 不读取我在 WriteFile 中编写的内容?