__cplusplus已定义和未定义的编译器指令
__cplusplus compiler directive defined and not defined
我在使用日食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
是如何工作的?
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 代码将永远不会看到您的定义。
相关文章:
- 保证编译器指令在C++中重新排序
- 防止编译器分离函数的指令
- x86 - 为什么编译器在下一条指令中插入看似毫无意义的JMP?
- 是跨平台和跨编译器 #error 指令
- 为什么延迟指令导致编译器错误
- 为什么使用某些编译器上的指令与私人的超载冲突
- 编译器生成昂贵的MOVZX指令
- 使库函数模板化以避免编译器指令是否有益?
- 使用Microsoft编译器生成 CMOV 指令
- 如何指定Xcode链接器的库和Xcode编译器的预处理器指令
- 如何在各种编译器中定义 __cplusplus 指令
- __cplusplus已定义和未定义的编译器指令
- 编译器指令在C++中的工作
- 是否可以(如何)在 c/c++ 代码中给出编译器指令
- 编译器是如何知道我的CPU的指令集的
- visual编译器指令在C++中重新排序优化(以及禁止它们的原因)
- 由于库与EXE项目中的编译器指令不匹配,内存损坏
- 在这种情况下,编译器可以根据自己的意愿对指令进行重新排序
- 让编译器生成adc指令
- 如何区分预处理器指令和编译器指令