#ifdef #else #endif宏问题

时间:2009-07-21 02:59:22

标签: c code-formatting

我是C新手,我正在维护代码。我在头文件中遇到过这个问题。我可以理解,如果源代码是在windows上编译的,它将进入if语句,如果代码在linux上编译,它将进入else语句。如果我错了,请纠正我。

然而,问题是为什么在所有包含标题前都使用了#(hash)?

非常感谢任何建议,

#ifdef WIN32
#   include <conio.h>
#   include <process.h>
#   include <stdlib.h>
#   include <string.h>
#else
#   include <unistd.h>
#   include <termio.h>
#   include <sys/types.h>
#   include <sys/stat.h>
#   include <fcntl.h>
#endif

6 个答案:

答案 0 :(得分:8)

哈希(#)表示预处理程序指令。预编译器在编译之前运行代码,并根据以“#”开头的所有行执行操作。 “#include filename.h”指令基本上复制了filename.h的所有内容,并将其粘贴到“#include filename.h”行所在的位置。

答案 1 :(得分:6)

#include 是您在C中包含文件的方式。

你可能会对#和include之间的空格感到困惑。

但他们并不重要。这些行仍然是#include。

答案 2 :(得分:3)

因为“#include”是告诉预处理器包含标头的语法。英镑之后的空间只是用于格式化,并不是绝对必要的。

答案 3 :(得分:3)

#行实际上不是由C编译器本身处理,而是由编译管道中作为早期阶段运行的预处理器处理。 “#”是它如何知道它负责的行。

同样的预处理器也可以在其他环境中使用。

预处理器不仅可以像#if#ifdef子句那样对表达式进行评估,还可以打开其他文件并使用#include插入它们,甚至可以进行文本替换使用#define条款。

更多信息可在Wikipedia entry on the C preprocessor

中找到

#include与VB.Net Imports语句或C#using语句不同。那些使引用到其他类,但#include实际上在源文件中的该位置插入了包含文件的文本。并且它可以递归地执行,因此包含的文件本身可能#include还有其他文件。

答案 4 :(得分:1)

#include指令告诉预处理器将指定文件的内容视为在指令出现点的源程序中出现这些内容。

http://msdn.microsoft.com/en-us/library/36k2cdd4(VS.80).aspx

答案 5 :(得分:1)

includeifdef等等都是预处理程序指令,因此必须在它们前面有pound(或hash)字符。编写此代码的编码器只是将左侧的所有#字符排成一行,以使代码看起来更清晰(在他看来)。

cplusplus.com有一个很好的overview预处理程序指令。