2

通常、*/(ブロック コメント クロージング)が/*(ブロック コメント オープニング)なしでコードに存在する場合、コンパイラはエラーを生成します。

ただし、次の場合にコンパイラがエラーを生成しないのはなぜですか?

#include <stdio.h>
int main(void)
{
    #ifdef abcd
    printf("what ever it is");
    #endif */   --> the problem with this stray '*/' after #endif
    return 0;
}
4

5 に答える 5

3

フラグなしで gcc 4.6.x で提供されたコードをコンパイルしたところ、警告が表示されました

warning: extra tokens at end of #endif directive [enabled by default]

したがって、プリプロセッサは最初にすべてのコメントを削除してから、#endif の行のすべてのデータをスキップします。バグなのか機能なのかはわかりませんが、警告が表示されたので、開発者はこの問題について知っています。

于 2013-03-28T12:50:28.857 に答える
2

知識に基づいた推測: これは厳密にはプリプロセッサのバグであり、 の後に続くものはすべて無視#endifされ、その後に何も続くことはありません。

于 2013-03-28T12:41:32.670 に答える
0

まず、*/コメントの一部ではないため、C 2011 (n1570) 5.1.1.2 1 3 で説明されている翻訳フェーズ 3 では無視されます。文字はそのまま通過します。

したがって、フェーズ 4 (プリプロセッサ ディレクティブの実行) で、コンパイラは#endif */. C 2011 (n1570) 6.10 1 によると、#endifディレクティブの適切な構文は次のとおりです。

# endif new-line

つまり、3 つの前処理トークン、、、#およびendif改行文字で構成され、トークン間にはスペースとタブを使用できます。適切#endif */な構文ではありません。

5.1.1.3 では、ソースが構文規則に違反している場合に診断メッセージを生成するために、適合する実装が必要です。したがって、この場合にコンパイラが警告またはエラー メッセージを生成しない場合は、準拠していません。

一部のコンパイラは、デフォルトで C 標準に準拠しないモードで動作します。コンパイラには、GCC の-std=c99スイッチなど、これを変更するためのスイッチがある場合があります。準拠モードでコンパイラが警告またはエラー メッセージを発行しない場合、それはバグです。

于 2013-03-28T13:15:56.673 に答える
0

あなたが持っていた質問を私が受けている場合:

/*
#ifdef abcd
printf("what ever it is");
#endif */

「/*」を最初から削除したため、コードがコンパイルされませんか?

コードがコンパイルされないので、これは良いことです。あなたは始まりなしでより近いコメントを持っています。

あなたができることは、「/」を「// /」に置き換えることです:

/*
#ifdef abcd
printf("what ever it is");
#endif //*/

これにより、最初から「/*」を問題なく削除できます。

于 2013-03-28T12:39:19.830 に答える
0
#endif */

これでブロック コメントは終了です。ブロック コメントの開始位置はどこですか?

/*
于 2013-03-28T12:39:44.960 に答える