我想了解multiple-include optimization如何与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
hdr.c
#include <stdio.h>
#include "header1.h"
#include "header2.h"
int main()
{
printf("%d\n", A);
return 0;
}
注意两个header1.h
和header2.h
使用相同的包括后卫。如预期的那样,该程序输出在header1.h中定义的值A
;由于它使用相同的包含保护,header2.h被跳过。
这里就是我想了解
- 在什么时候,当解析header2.h不预处理跳过这个文件?我的理解是,它在第1行的
#if
指令之后立即跳过此文件,即它不必等待匹配的#endif
。它是否正确? - 我可以在上面的例子中添加什么来演示这是如何工作的?
编辑:谢谢大家的答案。现在开始变得更有意义。后续问题。链接到这篇文章的第一行中的页面有如下文字
预处理通知这样的头文件,因此,如果头文件 出现在随后的#include指令和FOO的定义,那么它 被忽略,并且它不会预处理或者甚至重新打开该文件第二个 时间。这被称为多重包含优化。
如果我的理解正确,这意味着任何头文件只读一次,即使它包含多次给定的编译过程。所以,在应用程序代码或头文件中增加的守护程序不会带来任何好处。
通常我做我的侍卫包括以文件代入的大写的名字。与_这样的一个包括守卫不会在另一个文件中禁用第二个。不过,由于大多数编译器支持#pragma,一旦我在这些日子里使用包含守卫的代码。 – drescherjm
以下划线开头的名称后跟一个大写字母('_HDR_H_')和包含两个连续下划线的名称将保留给实现(编译器及其头文件)。不要使用它们。 –