当这头包括在内,它要做的第一件事是检查是否some_unique_name_here已先前定义的。如果这是我们第一次包括标题,some_unique_name_here没有被定义。因此,它#定义some_unique_name_here和包括该文件的内容。如果这不是我们包含标题的第一时间,some_unique_name_here将已经被定义从第一次标题的内容包括。因此,整个标题将被忽略。
你所有的头文件应该有他们的头文件保护。some_unique_name_here可以是任何你想要的名字,但通常与_h附加到它的头文件的名称是。例如,添加。H会有头文件保护:
1
2
3
4
5
6
# ifndef add_h
#定义add_h
/ /你的声明在这里
# endif
即使是标准库包含使用头文件保护。如果你要在Visual Studio 2005表达iostream头文件看一看,你会看到:
1
2
3
4
5
6
# ifndef _iostream_
#定义_iostream_
/ /内容在这里
# endif
亚历克斯
2007年12月13日晚8点15分,日志的回复
govz,据我所知,这是一个官方的预处理部分。你也应该能够使用和测试是否多个符号是在同一时间的定义:
#如果定义(symbol_a)和定义(symbol_b)
我没有涵盖这些具体的概念在本教程中,因为我甚至不盖什么| |和&符号意味着直到3.6节。这就应该是一种快速的介绍,而不是一个完整的预处理教程。:)
有相当多的其他事情预处理器可以做,我不(或不打算)在本教程中,盖。如果你有兴趣学习更多,有相当多的预处理文件是公开。这是一个。
亚历克斯
2007年12月23日下午登录回复8:38
billerr,你可以使用这样的定义有以下几个原因。头文件保护是主要的一个。然而,它可以是有用的定义的代码只执行时一定#定义已设置。例如,你可能会做这样的事:
如果定义了_debug #
cout << ndebugvariable << endl;
# endif
这将只打印ndebugvariable如果程序与_debug编译#定义符号。你可以把这个符号在编制一个用于开发或测试版的时候,但把它关掉为发布版本。
在游戏中我写了,我用了一个#定义切换是否产生随机地下城(游戏的发布版本)或一个特殊的调试级别(测试/开发)。我可以在两肘的评论/uncommenting的#定义和重新编译。