4

MSVC のみのCコードで奇妙なコンパイル エラーが発生します。より正確に:

エラー C2143: 構文エラー: ';' がありません 「タイプ」の前に

C2143 はかなり一般的なエラーであり、SO に関する質問は無数にありますが、今のところどれも当てはまらないようです。最も近いものはここで見つけることができ、ブロックの先頭で変数を宣言することの重要性を強調しています。これはここで尊重されているようです.

サンプルコードは次のとおりです。

#define       NB_LL 6
typedef struct { long long ll[NB_LL ]; } stateSpace_t;
#define ALLOCATE_ONSTACK(stateName)  stateSpace_t stateName##_s; void* stateName = (void*) &(stateName##_s);

次のコードはうまく機能します。

void f1()
{
    ALLOCATE_ONSTACK(state1);
    /* do something */
}

これはしません:

void f2()
{
    ALLOCATE_ONSTACK(state1);
    ALLOCATE_ONSTACK(state2);   // <--- error C2143: syntax error : missing ';' before 'type'
    /* do something */
}

2 番目のコードは GCC でうまく機能するため、問題は MSVC に限定されているようです。私の理解では、マクロALLOCATE_ONSTACK()は変数の宣言と初期化のみを行うため、C構文を尊重しているようです。

それは...ですか?

4

2 に答える 2

7

OK、これはかなり複雑です。

を見てください

#define ALLOCATE_ONSTACK(stateName)

キャラで終わる;

今あなたのコードを見てください:

ALLOCATE_ONSTACK(state1);

こちらも';'文字で終了。つまり、この特定の行には、次の 2 つの';'文字があります。

MSVC は C99 ではないため、すべての宣言をブロックの先頭で行う必要があります。2 つの';'文字が続いているため、宣言領域が終了したかのように動作します。したがって、で他の変数を宣言すると、次のようになります。

ALLOCATE_ONSTACK(state2);

その後、構文エラーで失敗します。

GCCはC99なのでそのような問題はありません。

';'マクロの末尾またはソース コード内の文字を削除してください。必要なのは 1 つだけです。どちらのソリューションが優れているかわかりません...

[編集] :コメントやその他の回答で示唆されているように、マクロからセミコロンを削除する方が良い解決策に見えます。

于 2013-05-31T03:15:14.400 に答える
4

ALLOCATE_ONSTACK マクロ定義の最後と呼び出しの最後にセミコロンがあります。これは、各マクロ展開の後に実質的に null ステートメントがあることを意味します。このため、2 番目の展開はブロックの先頭にはありません。

古典的に、C では、すべての宣言が最初の非宣言ステートメントの前のブロックで行われる必要がありました。gcc はこの要件を緩和するため、エラーは発生しません。

末尾のセミコロンなしでマクロ定義を書き直すことをお勧めします。

編集:パンチに打ちます。

于 2013-05-31T03:14:37.387 に答える