#ifdef _cplusplus
#include headerfile.h
#endif
我理解这背后的概念,但我并不完全理解为什么需要它。
如果目的是在C ++中编译代码时防止标题“乱码”:
- 如果没有在C ++中编译代码?
- 如果没有那个标题,代码会继续运行吗?
切向:
- 在什么情况下需要这个?
答案 0 :(得分:4)
用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 ++就很难搞清楚它。