複数インクルードの最適化が 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
予想どおり、このプログラムA
は header1.h で定義された値を出力します。header2.h は、同じインクルード ガードを使用するためスキップされます。
これが私が理解しようとしているものです
- header2.h を解析するときに、プリプロセッサがこのファイルをスキップするのはどの時点ですか? 私の理解では、このファイルは 1 行目のディレクティブの直後にスキップされます
#if
。つまり、一致するのを待つ必要はありません#endif
。これは正しいです? - これがどのように機能するかを示すために、上記の例に何を追加できますか?
編集:答えてくれてありがとう。これは今、より理にかなっています。フォローアップの質問です。この投稿の最初の行にリンクされているページには、次のテキストがあります
プリプロセッサはそのようなヘッダー ファイルを認識するため、ヘッダー ファイルが後続の #include ディレクティブに表示され、FOO が定義されている場合、それは無視され、ファイルを前処理したり、再度開いたりすることはありません。これは、複数インクルードの最適化と呼ばれます。
私がこれを正しく理解している場合、これは、特定のコンパイル プロセスに複数回含まれていても、ヘッダー ファイルは 1 回だけ読み取られることを意味します。そのため、アプリケーション コードまたはヘッダー ファイルにインクルード ガードを追加しても、何のメリットもありません。