我最近了解了C编译器的实际工作方式,并且有一个我不理解的特定配置:当我编写标头时,看起来像这样:
#ifndef HEADERNAME
#define HEADERNAME
//function declarations
#endif
据我所知,这意味着,一旦预处理器一次通过了一次标头文件(粘贴了其内容,而不是#include呼吁该文件的#include),它就定义了名称,并将在下次跳过所述标题。这是否意味着文件仅复制一次?
因此,我对以下配置有一个问题:
我们有几个文件:Main.C A.C A.H B.C B.H d.c D.H.
-main.c包括A.H B.H和D.H,-A和B包括D.H.
如果预处理器通过d.h并将其复制为A,则可以在B中复制D.H,因为它已经通过了D.H?而且,如果仅复制一次,那么卑诗省的代码如何访问d.h中功能的声明(因为在进一步编译时需要它们)。
我尝试了这种配置,发现它确实有效,但我不明白。
您有三个翻译(或预处理翻译)单元:
main.c
A.h
B.h
和
D.h
的指令。依次将文件包括标题
A.h
。所以你有a.h D.H B.H D.H D.H main.c 指令中的the the the
B.h
D.h
仅由预处理器处理一次,因为在第二个和第三个标题中,已经定义了名称D.h
#ifndef HEADERNAME
#define HEADERNAME
//function declarations
#endif
带有标头
D.h
依次包括标头HEADERNAME
A.c
带有标头
A.h
依次包括标头D.h
因此,
B.c
和
B.h
D.h
,因为每个翻译单元中包含标头(2和3)。