1

3 つのファイルがあり、それをコンパイルしたいと考えています。

最初のファイルは app.c です

#include"sum.h"
int main (void)
{
    sum();
    return 0;
}

2 番目のファイルは sum.h です。

#ifndef SUM_H
#define SUM_H
void sum ();
#endif

そして 3 番目のファイル sum.c

#include"sum.h"
void sum ()
{
return;
}

そして私はこれらの声明を書きます:

#ifndef SUM_H
#define SUM_H
...
...
...
#endif

のコンテンツの多重定義を防ぐためsum.h

コンパイル中app.cに、前処理段階に入り、次に前sum.c処理段階に入ります。私の質問は、プリプロセッサが myapp の最後のファイルで定義されてsum.cいることをどのように知っているかということです。SUM_H各ソースファイルは、前処理段階とコンパイル段階に個別に入ると思います。

4

1 に答える 1

2

はい、各ファイルは個別にコンパイルされるため、インクルード ガードは同じ翻訳単位にヘッダー ファイルが複数含まれることを防ぐだけであり、 異なる翻訳単位にまたがることはできません

app.cがプリコンパイラによって前処理される場合は、 が既に定義されているかどうかのみをチェックしSUM_Hますapp.csum.hこれにより、この現在の翻訳単位のみに異なるヘッダーを介して複数回含まれることが回避されます。これは、sum.h一度含まれるとすぐSUM_Hに定義されるためです。

于 2013-02-03T07:37:56.380 に答える