1

この質問は、ヘッダー ファイル インクルードの標準的な動作を理解することです (私のコンパイラに実装されているものではありません)。

同じ名前のヘッダー ファイルが 2 つあります (ただし、内容は異なります)。

1) /user/include/myheader.h  # In standard system folder
2) /private/myheader.h       # In my private folder

両方のヘッダーに同じ複数の包含防止マクロが含まれていると仮定します

#ifndef MYHEADER
#define MYHEADER
...
#endif

/private/test.c上記のヘッダーの両方を含むC file があります。

#include <myheader.h>  // Includes from standard system folder
#include "myheader.h"  // Includes from the folder where test.c is present

各 MYHEADER 定義には個別の名前空間があるため、前処理中に両方のファイルのコンテンツが C ファイルに入れられますか? または、MYHEADER が同じ名前空間で既に定義されているため、2 番目の包含は防止されますか?

4

4 に答える 4

3

すべてのマクロに対して 1 つの名前空間しかなく、すべてのマクロは同じ名前空間に配置されます。異なるヘッダー ファイルに何かを配置しても、これには影響しません。それらはすべて同じ名前空間に配置されます。したがって、あなたの例では、最初のヘッダーが を定義しますMYHEADER。これにより、2 番目のヘッダーが (効果的に) 無視されます。

于 2012-09-19T18:06:03.037 に答える
2

N1570 :

6.10.3 マクロ置換

...
7 の直後の識別子をマクロ名defineと呼びます。マクロ名用の名前空間が 1 つあります。前処理トークンの置換リストの前後にある空白文字は、いずれの形式のマクロでも置換リストの一部とは見なされません。

鉱山を強調します。

書かれているように、最初のmyheader.hファイルの内容のみが処理されます。

于 2012-09-19T18:29:25.703 に答える
1

C 標準1には、プリプロセッサ定義の「名前空間」のようなものはありません。がどのようにMYHEADER定義されていても2、2 番目のファイルの内容は無視されます。


1 C99 標準のセクション 6.2.3 では、(1) ラベル用、(2) struct/union/enum タグ用、(3) 各構造体または共用体のメンバー用、(4) その他すべて用の 4 つの名前空間を定義しています。 . プリプロセッサ定義は、これらの名前空間のいずれにも属しません。「マクロ名とマクロ パラメータは、ここではこれ以上考慮されません。プログラム変換のセマンティック フェーズの前に、ソース ファイル内のマクロ名の出現は前処理トークン シーケンスによって置き換えられるためです。マクロ定義を構成します。」

2定義に関する限り、MYHEADERいくつかのオプションがあります。C ファイル、ヘッダー ファイルで定義するか、C コンパイラの対応するオプションを使用してコマンド ラインから渡すことができます。

于 2012-09-19T18:05:09.513 に答える
0

#define ディレクティブにはグローバル スコープがあるため、1 つの定義のみが使用されるため、2 番目のインクルードは何もしません。

このような問題を防ぐには、MY_PROJECT_MY_HEADER などを使用する必要があります。

于 2012-09-19T18:17:32.933 に答える