【问题标题】:__cplusplus compiler directive defined and not defined [duplicate]__cplusplus 编译器指令已定义和未定义 [重复]
【发布时间】:2015-02-27 22:11:52
【问题描述】:

我在使用 Eclipse CDT 时遇到问题。 我有一个使用 C FatFs 库的 C++ 项目。我正在尝试实现 fatfs 文件。 问题:我在多个文件中添加

#ifdef __cplusplus 
extern "C" 
{ 
#endif 

// code..

#ifdef __cplusplus
}
#endif

包装。但由于某种原因,在一个 .h 文件中定义了 _cplusplus,而在另一个 .h 文件中没有定义 __cplusplus

有什么建议吗?
可以发截图澄清一下。

【问题讨论】:

  • 我假设在真正的代码中你清楚 __cplusplus 中的下划线数量?
  • @RobbeVanAssche:复制粘贴实际代码总是更好。
  • 或者实际上是一个自包含的testcase。让我感到困惑的是,没有人这样做。没有测试用例怎么调试代码?!?!
  • @RobbeVanAssche:最好的方法是不要向我们展示您的整个应用程序。只需将其缩减为说明问题的最小测试用例,然后将其复制并粘贴到您的问题中。阅读:sscce.org
  • @RobbeVanAssche:我认为你不明白我所说的 testcase 是什么意思。 sscce.org您不应该通过检查整个现实世界应用程序的全部内容来调试单个语言功能。这简直太傻了!分而治之,我的朋友。

标签: c++


【解决方案1】:

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

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

【讨论】:

  • 但它是一个头文件。头文件的编译是否取决于它是否包含在 .c 或 .cpp 文件中?当我在 .c 和 .cpp 文件中都包含头文件时会发生什么?
  • 是的,这很重要。 .cpp.c 文件是正在编译的主文件,这是 IDE 和构建系统在确定如何编译它时查看的内容。
  • 感谢您的澄清!
  • 请记住,#include 语句只是将指定文件的内容带入具有#include 语句的文件的内容中。所以是的,如果头文件包含在 .c 文件中,那么头代码将被解释为 C 代码,而如果头文件包含在 .cpp 或其他 C++ 文件中,那么头代码将被解释为改为 C++ 代码。
【解决方案2】:

看这里:Combining C++ and C — how does #ifdef __cplusplus work?

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

extern "C" 所做的是影响链接。 C++ 函数,在编译时, 他们的名字被弄乱了——这就是使重载成为可能的原因。 函数名称根据类型和数量进行修改 参数,这样两个同名的函数就会有 不同的符号名称。

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

另外,你可能想要两个 #ifdef __cpluspluss:

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

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

【讨论】:

  • 例如:我有标头 foo.h。我将标头 foo.h 包含到 foo.c 和 bar.cpp 中。第一种情况,头文件由c编译器处理,第二种情况,头文件由c++编译器处理?
  • 同一个编译器,只是运行模式不同而已。所以是的,默认情况下编译foo.c 时不会定义__cplusplus,因为该文件是在C 模式而不是C++ 模式下编译的。除非你强制编译器在 C++ 模式下编译它,一些编译器确实提供了一个选项。
猜你喜欢
  • 2012-06-18
  • 1970-01-01
  • 2019-11-06
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 2019-10-01
相关资源
最近更新 更多