我在使用 Eclipse CDT 时遇到问题。
我有一个使用 C FatFs 库的 C++ 项目。我正在尝试实现 fatfs 文件。 问题:在多个文件中,我添加了这个包装器:
#ifdef __cplusplus
extern "C"
{
#endif
// code..
#ifdef __cplusplus
}
#endif
但由于某种原因,在一个
.h
文件中定义了 __cplusplus
,而在另一个 .h
文件中 __cplusplus
未定义。
有什么建议吗?
是否定义
__cplusplus
取决于包含头文件的文件是如何编译的。如果文件被编译为 C 源代码 (.c
),则不会对其进行定义。如果文件被编译为 C++ 源文件(.cpp
、.cc
或与 C++ 源文件关联的任何其他扩展名),则将定义 __cplusplus
。
仔细检查文件扩展名,如有必要,检查项目中的设置,以确保文件正确编译。
看这里:结合 C++ 和 C —
#ifdef __cplusplus
如何工作?
并没有真正改变编译器读取的方式 代码。如果你的代码在 .c 文件中,它将被编译为 C,如果是 在 .cpp 文件中,它将被编译为 C++(除非你做了一些事情 你的配置很奇怪)。extern "C"
的作用是影响联动。 C++ 函数在编译时, 他们的名字被破坏——这就是重载成为可能的原因。 函数名称根据类型和数量进行修改 参数,这样两个同名的函数就会有 不同的符号名称。extern "C"
内的代码仍然是C++代码。有限制 你可以在extern "C"
块中做什么,但它们都是关于链接的。extern "C"
另外,您可能想要两个
#ifdef __cplusplus
:
#ifdef __cplusplus
extern "C" {
#endif
// ...
#ifdef __cplusplus
}
#endif
否则,您的 C 代码将永远看不到您的定义。