用#ifdef __cplusplus包装标题的目的

时间:2010-12-18 08:34:06

标签: c++ macros

#ifdef _cplusplus
   #include headerfile.h
#endif

我理解这背后的概念,但我并不完全理解为什么需要它。

如果目的是在C ++中编译代码时防止标题“乱码”:

- 如果没有在C ++中编译代码?

- 如果没有那个标题,代码会继续运行吗?

切向:

- 在什么情况下需要这个?

4 个答案:

答案 0 :(得分:4)

  • 如果没有在C ++中编译代码怎么样?

用C。

  • 如果没有该标题,代码将如何继续运行?

这就是包含标题的原因。如果它在没有带有C ++编译器的头文件的情况下编译和工作,那么#ifdef将毫无意义。

  • 什么情况需要这个?

他们可能会在使用C ++编译器编译时引入所需的东西。也许调试宏需要使用std::cerr,然后该标头可能包含<iostream>。它可能有数百万个原因。

答案 1 :(得分:2)

这样做的通常原因是给函数C或C ++链接:

#ifdef _cplusplus
extern "C" {
#endif
#include headerfile.h
#ifdef _cplusplus
}
#endif

答案 2 :(得分:1)

如果没有定义C ++,它将依赖于非C ++特定的头文件(可能用C编写)

什么情况需要这是一个很好的问题。

答案 3 :(得分:0)

我知道这个帖子可能已经死了,但它在搜索引擎中仍然非常活跃,所以我想我会发布更多细节。 C ++在编译时会破坏例程名称(添加一堆字符)。我没有知道告诉你为什么这样做。我猜想要确保在程序中的所有命名空间和类中唯一标识例程。无论如何,C不会破坏名字。如果您尝试在项目中包含C头文件,那么在编译期间一切都会很好用,但是当您链接时,C ++会破坏C头文件中的例程名称,并尝试在C例程的目标文件中找到它们。它将无法找到它们,因为它预计它们会被破坏。

当您尝试使用预先存在的C库时,这种情况最为普遍。在这种情况下,您无法将C代码重新编译为C ++以恢复名称修改。所以你必须告诉C ++编译器使用'extern“C”'寻找C风格的例程。将它放在头文件中是没有必要的,但是只要C ++编译器找到C例程的声明,就需要它。头文件放置是为了避免重复自己。

在某些IDE中也会发生这种情况。但基本上导致C库与C ++程序/库链接。如果用gcc编译它,那么g ++就很难搞清楚它。