1

プリプロセッサ #define マクロを使用して、ヘッダー ファイル内の関数の数をカウントしています。

#define __INDEX -1

//First group of functions
void func1(void);
#define __FUNC1_INDEX __INDEX + 1
void func2(void);
#define __FUNC2_INDEX __FUNC1_INDEX + 1
#undef __INDEX
#define __INDEX __FUNC2_INDEX

//Second group of functions
void func3(void);
#define __FUNC3_INDEX __INDEX + 1
void func4(void);
#define __FUNC4_INDEX __FUNC3_INDEX + 1
#undef __INDEX
#define __INDEX __FUNC4_INDEX

//Third group of functions
void func5(void);
#define __FUNC5_INDEX __INDEX + 1
void func6(void);
#define __FUNC6_INDEX __FUNC5_INDEX + 1
#undef __INDEX
#define __INDEX __FUNC6_INDEX

#define __NUM_FUNCTIONS __INDEX + 1

プリプロセッサは、最初の 2 つの関数セットを正常に処理しますが、次の行に到達すると、次のようになります。

#define __FUNC5_INDEX __INDEX + 1

__INDEX に対して「このスコープで定義されていません」というエラーが表示されます。これを本当に混乱させているのは、まったく同じことが 2 番目の関数グループで [成功裏に] 行われているという事実です。__FUNC3_INDEX は __INDEX + 1 の値を取ります。私が知る限り、どこにもタイプミスはありません...何が問題なのですか?

g++ 4.8 を使用しています。

4

1 に答える 1

2

プリプロセッサ マクロではカウントできません。それらは単なる文字列展開です。

プリプロセッサがこれで終了した後:

#define __FUNC5_INDEX __INDEX + 1
#define __FUNC6_INDEX __FUNC5_INDEX + 1
#undef __INDEX
#define __INDEX __FUNC6_INDEX

次の定義が有効です。

__FUNC5_INDEX → __INDEX + 1
__FUNC6_INDEX → __FUNC5_INDEX + 1
__INDEX → __FUNC6_INDEX

計算は行われていません。さらに、ディレクティブ内では置換は実行されません。#define

ここで、展開しようとすると__INDEX(おそらく の展開の一部として__NUM_FUNCTIONS)、次のことが起こります。

__INDEX → __FUNC6_INDEX
        → __FUNC5_INDEX + 1
        → __INDEX + 1 + 1

この時点で、独自の展開内でマクロを展開することはできないため、マクロの展開は停止します。トークンはそのまま残されます。

__INDEXその結果、プログラム内でシンボルを変数として使用することになります。しかし、変数__INDEXが定義されていないため、エラーが発生します。

ちなみに、2 つのアンダースコアで始まる記号、または 1 つのアンダースコアと大文字で始まる記号は使用しないでください。これらは標準ライブラリ用に予約されています。

于 2013-10-24T04:04:08.837 に答える