2009-07-21 56 views
1

我是C新手,我维护着一些代码。我在头文件中遇到了这个问题。我可以理解,如果在Windows上编译源代码,它将输入if语句,否则,如果代码在Linux上编译,它将进入else语句。纠正我,如果我错了。#ifdef #else #endif宏问题

但是,问题是为什么在所有包含头之前使用#(散列)?

非常感谢您的任何建议,

#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

的#include是您在C.

文件您可以通过#之间的空间混淆和包含的方式。

但他们没关系。这些行仍然是#include。

+0

是的,就是这样。我被#和包含之间的空间弄糊涂了。谢谢。 – ant2009 2009-07-21 03:21:13

3

因为“的#include”是告诉预处理器包括一个头的语法。英镑之后的空格仅用于格式化,并非绝对必要。

8

散列(#)表示预处理器指令。预编译器在编译前运行代码,并根据以“#”开头的所有行进行操作。 “#include filename.h”指令主要复制filename.h的所有内容,并将其粘贴到“#include filename.h”行所在的位置。

3

的#线由C编译器本身的实际处理,而是由预处理运行在编译流水线的早期阶段。 “#”是它如何知道它负责哪一行。

同样的预处理器也可以在其他上下文中使用。

预处理不但可以做表达式求值,如#if#ifdef条款,但它也可以打开其他文件,并使用#include插入它们甚至做使用#define条款文本替换。

更多信息请参见Wikipedia entry on the C preprocessor

#include与例如VB.Net Imports声明或C#using声明不同。那些使引用为其他类,但#include实际上将包含文件的文本插入源文件中该位置。它可以递归地进行操作,这样包含的文件本身可以是其他的文件。

1

includeifdef等都是预处理指令,所以他们必须在他们面前英镑(或哈希)字符。编写这段代码的编码人员简单地列出了左侧的所有这些#字符,以使代码看起来更清晰(在他看来)。

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