5
#define N 10;

int main()
{
    int x;

    for (int i=0; i<N; i++)
        x = i;

    return 0;
}

これを g++ でコンパイルした結果:

test-define.cpp: In function ‘int main()’:
test-define.cpp:7:22: error: expected primary-expression before ‘;’ token
test-define.cpp:7:22: error: expected ‘)’ before ‘;’ token
test-define.cpp:7:24: error: name lookup of ‘i’ changed for ISO ‘for’ scoping [-fpermissive]
test-define.cpp:7:24: note: (if you use ‘-fpermissive’ G++ will accept your code)
test-define.cpp:7:27: error: expected ‘;’ before ‘)’ token

しかし、7 行目を に変更すると、正常にコンパイルされfor (int i=0; i<10; i++)ます。

これはなぜですか? また、#defineディレクティブを使用して目的を達成するにはどうすればよいですか?

4

2 に答える 2

14

セミコロンを削除します - あなたは良いでしょう - セミコロンは置換に含まれています

コンパイラにプリプロセッサのみを実行させると便利な場合があります。gcc/g++ を使用すると、次のようなことができます

gcc -E file.c > result.txt

これにより、マクロがどのように展開されたかがわかります (ヒントはファイルの最後から始まります)。

于 2012-09-08T01:40:58.750 に答える
7

マクロを定数に置き換えることをお勧めします。

const int N = 10;

マクロはできるだけ避けたほうがよいでしょう。マクロにはスコープがありません。それらはグローバルなテキスト置換です。コンパイラはそれらを認識しないため、デバッガを使用してもそれらについて認識されません。私が忘れているそれらを使用しない他の理由がおそらくあります。

于 2012-09-08T01:53:43.717 に答える