__cplusplus 编译器指令已定义和未定义[重复]

问题描述 投票:0回答:2

我在使用 Eclipse CDT 时遇到问题。

我有一个使用 C FatFs 库的 C++ 项目。我正在尝试实现 fatfs 文件。 问题:在多个文件中,我添加了这个包装器:

#ifdef __cplusplus 
extern "C" 
{ 
#endif 

// code..

#ifdef __cplusplus
}
#endif

但由于某种原因,在一个

.h
文件中定义了
__cplusplus
,而在另一个
.h
文件中
__cplusplus
未定义。

有什么建议吗?

c++ c macos
2个回答
6
投票

是否定义

__cplusplus
取决于包含头文件的文件是如何编译的。如果文件被编译为 C 源代码 (
.c
),则不会对其进行定义。如果文件被编译为 C++ 源文件(
.cpp
.cc
或与 C++ 源文件关联的任何其他扩展名),则将定义
__cplusplus

仔细检查文件扩展名,如有必要,检查项目中的设置,以确保文件正确编译。


1
投票

看这里:结合 C++ 和 C —

#ifdef __cplusplus
如何工作?

extern "C"
并没有真正改变编译器读取的方式 代码。如果你的代码在 .c 文件中,它将被编译为 C,如果是 在 .cpp 文件中,它将被编译为 C++(除非你做了一些事情 你的配置很奇怪)。

extern "C"
的作用是影响联动。 C++ 函数在编译时, 他们的名字被破坏——这就是重载成为可能的原因。 函数名称根据类型和数量进行修改 参数,这样两个同名的函数就会有 不同的符号名称。

extern "C"
内的代码仍然是C++代码。有限制 你可以在
extern "C"
块中做什么,但它们都是关于链接的。

另外,您可能想要两个

#ifdef __cplusplus

#ifdef __cplusplus 
extern "C" { 
#endif 
    // ...
#ifdef __cplusplus
}
#endif

否则,您的 C 代码将永远看不到您的定义。

© www.soinside.com 2019 - 2024. All rights reserved.