我试图了解多重包含优化如何与 gcc 一起工作。最近,我一直在阅读很多代码,其中包含标准头文件的保护,例如
#ifndef _STDIO_H_
#include <stdio.h>
#endif
我试图弄清楚这个结构是否有任何好处。
这是我写的一个例子来更好地理解这一点。
header1.h
#ifndef _HDR_H_
#define _HDR_H_
#define A (32)
#endif
header2.h
#ifndef _HDR_H_
#define _HDR_H_
#define A (64)
#endif
硬盘驱动器
#include <stdio.h>
#include "header1.h"
#include "header2.h"
int main()
{
printf("%d\n", A);
return 0;
}
请注意,两者都header1.h
使用header2.h
相同的包含防护。正如预期的那样,该程序输出A
header1.h 中定义的值;header2.h 被跳过,因为它使用相同的包含保护。
这就是我想要理解的
- 在解析 header2.h 时,预处理器会在什么时候跳过这个文件?我的理解是它
#if
在第 1 行的指令之后立即跳过该文件,即它不必等待匹配的#endif
. 它是否正确? - 我可以在上面的示例中添加什么来演示它是如何工作的?
编辑:谢谢大家的回答。这现在开始变得更有意义了。一个后续问题。链接到这篇文章第一行的页面有以下文字
预处理器注意到这样的头文件,因此如果头文件出现在随后的#include 指令中并且定义了 FOO,那么它会被忽略并且它不会预处理甚至第二次重新打开文件。这称为多重包含优化。
如果我理解正确,这意味着任何头文件都只读取一次,即使它在给定的编译过程中被多次包含。因此,应用程序代码或头文件中的额外包含保护没有任何好处。