トップC-Tips > C言語プログラムのコメント

C言語プログラムのコメント[2012.11.06]

1.正常なプログラム

まず、次の comment01.cをコンパイル・実行してください。

#include 
int main() {
    printf("+-*/123abc\n");
    printf("OK\n");
}

下に示す結果が得られるでしょう。

c:\mh\www\c-tips\misc>tcc comment01.c

c:\mh\www\c-tips\misc>comment01
+-*/123abc
OK

2.コメントアウトしたプログラム

次に、最初の printf文をコメントにした comment02.cをコンパイルしてください。

#include 
int main() {
    /* printf("+-*/123abc\n"); */
    printf("OK\n");
}

TCC でコンパイルした場合、次のようになります。

c:\mh\www\c-tips\misc>tcc comment02.c
comment02.c:3: stray '\' in program

TCC でコンパイルした場合、次のようになります。

c:\mh\www\c-tips\misc>tcc comment02.c
comment02.c:3: stray '\' in program

GCC でコンパイルした場合、次のようになります。

c:\mh\www\c-tips\misc>gcc comment02.c
comment02.c: In function 'main':
comment02.c:3:20: error: invalid suffix "abc" on integer constant
comment02.c:3:20: error: stray '\' in program
comment02.c:3:27: error: expected ';' before 'n'
comment02.c:3:28: warning: missing terminating " character
comment02.c:3:27: error: missing terminating " character

自作コンパイラMCC でコンパイルした場合、次のようになります。

c:\mh\www\c-tips\misc>gcc comment02.c
comment02.c:3: missing terminating " character

このように、コンパイラによってエラーメッセージは異なりますが、 大抵のコンパイラはエラーメッセージを出すでしょう。

下の解答を見る前に、何がエラー原因か考えてください。 私はこの種のエラーをときたま経験しています。極めて稀なケースというわけではありません。

3.エラー原因

printf("+-/*123abc\n"); のように、 プログラム中の文字列に /* があっても、コメントの始まりとはなりません。 しかし、コメントの終わりについては事情がことなります。

/* printf("+-*/123abc\n"); */ の場合、文字列 "+-*/123abc\n" 中に */ があるため、 ここで、コメントが終わりと解釈されます。 従って、123abc\n"); */ は、コメント扱いにならず、字句解析、構文解析の対象となります。

TCCの場合、文字列ではないのに \ が現れたため、"error: stray '\' in program" というエラーメッセージを出したわけです。

GCCの場合、数値123の後に、abc という不当な文字列が続いたことから error: invalid suffix "abc" on integer constant というエラーメッセージを出しています。

MCCの場合、\nの次の " を文字列の始まりと解釈して、 この行の終わりまでに、文字列の終わりを表す引用符 " がないため、 missing terminating " character というエラーメッセージを出したわけです。

このように、エラーメッセージ自体は、コンパイラの字句解析、 構文解析・意味解析の手順の違いにより、異なりますが、エラーがあることには変わりがありません。

コメントとしては、何を書いてもいいことから、 字句解析や構文解析・意味解析は一切行わず、*/ が現れたらコメントの終わりとみなすため、 このような結果となります。

この場合、// コメントであれば、エラーは生じません。 また */ を消したり、* / のように間にスペースを入れればエラーを回避できますが、 元に戻すことがあるかも知れないので、ただし書きを付けるなどの注意が要ります。