0

ヘッダー ファイルのインクルード ガードは、コードのセクションを二重インクルードから保護するためによく使用されます。

#ifndef FOOBAR_H
#define FOOBAR_H

extern void myfoofunc(void);

#endif

通常、インクルード ガードは、オブジェクトのようなマクロが既に定義されている場合、ブロック内の行がインクルードされないという期待に依存しています#ifndef。したがって、二重インクルードを回避します。

#define多くのインクルード ヘッダーの行に空の置換リストがあることに気付きました。C99 標準は、空の置換リストで定義されたオブジェクトのようなマクロが によって「定義された」と見なされることを保証します#ifndefか?

の構文を説明するとき、C99 標準は、セクション 6.10.3 パラグラフ 9#defineで replacement-list が必要であることを暗示しているようです。

フォームの前処理ディレクティブ

# 識別子置換リストの改行を定義

マクロ名の後続の各インスタンスを、ディレクティブの残りの部分を構成する前処理トークンの置換リストに置き換える、オブジェクトのようなマクロを定義します。次に、以下に指定されているように、置換リストを再スキャンして、さらに多くのマクロ名を探します。

これは、代わりにインクルード ヘッダーを次の形式にする必要があることを意味します#define FOOBAR_H 1か?

4

3 に答える 3

1

いいえ、そうではありません。置換リストは空である可能性があります。は true である#define FOOことを意味しますが、何も置き換えられません。defined FOOFOO

例:

#define FOO
#define BAR 1

#if defined FOO && defined BAR
int a = FOO + BAR ;
#endif

前処理の結果:

int a = + 1 ;
于 2013-06-27T20:57:25.950 に答える
0

いいえ; 行ではマクロ置換は行われません#ifndef。その場合、ステートメント全体が構文エラーになります ( の後に何もないため#ifndef)。

実際にいくつかの例を見たことがあると思いますが#define FOOBAR_H 1、それは個人的な好みです.

于 2013-06-27T21:00:40.000 に答える