如何不重复的C预处理器手柄包含并复制多次

问题描述 投票:0回答:1

我最近了解了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中功能的声明(因为在进一步编译时需要它们)。

我尝试了这种配置,发现它确实有效,但我不明白。

您有三个翻译(或预处理翻译)单元:

c macros c-preprocessor preprocessor
1个回答
0
投票

main.c

包括明确包括
    A.h
  1. 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
  1. 
    
    因此,
    B.c
    B.h
  2. 中的代码可以访问标题中的声明
  3. D.h
    ,因为每个翻译单元中包含标头(2和3)。
        
    
    
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.