[迷信] ソースファイルの末尾に }

これは迷信ではなく、よくある間違いです。この間違いの最悪なところは、書いた本人も、自分がどう書いたのかをほとんど自覚していないところにあります。実際、「ソースファイルの末尾に }」と指摘しただけでは、具体的にどういう状況なのか分からない場合も少なくないでしょう。

#include <stdio.h>
 
int main(void)
{
  puts("Hello, World!");
  return 0;
}[EOF]

今回問題としているのは、上のように最後の } のあとに改行がなく、そこでファイルが終わっている場合に未定義の動作を引き起こすということです。Cの規格では、

5.1.1.2 翻訳フェーズ  (中略)
(2) (中略)空でないソースファイルは,改行文字で終了しなければならない。さらに,この改行文字の直前に(接合を行う前の時点で)逆斜線があってはならない。

JIS X3010:2003より引用

と規定されており、C++の規格では、

2.1 翻訳過程 (中略)
2) (中略)空でないソースファイルが改行文字で終わっていない場合,その動作は,未定義とする。空でないソースファイルが逆斜線に続く改行文字で終わっている場合,その動作は,未定義とする。

JIS X3014:2003より引用

と規定されています。

この問題は、ファイルの末尾に } がある場合だけでなく、主にヘッダファイルで、末尾に #endif がある場合にもよく発生します。特に、改行文字が何らかの記号として表示されないエディタ(統合開発環境を含む)、EOFが表示されないエディタを使っている場合は要注意です。

この記事のトラックバックURL:

http://www.kijineko.co.jp/trackback/538