一部の C++ コンパイラで次の警告が表示される理由は何ですか?
ファイルの最後に改行がない
ソース/ヘッダー ファイルの末尾に空の行が必要なのはなぜですか?
一部の C++ コンパイラで次の警告が表示される理由は何ですか?
ファイルの最後に改行がない
ソース/ヘッダー ファイルの末尾に空の行が必要なのはなぜですか?
改行がない場合に発生する可能性のある問題のいくつかを考えてみてください。ANSI規格によると、最初のファイルのファイルは、ファイルの先頭にそのまま挿入され、ファイルの内容の後に#include
改行は挿入されません。#include <foo.h>
したがって、パーサーの最後に改行がないファイルを含めると、の最後の行がfoo.h
の最初の行と同じ行にあるかのように表示されfoo.cpp
ます。foo.hの最後の行が新しい行のないコメントだった場合はどうなりますか?これで、の最初の行foo.cpp
がコメント化されました。これらは、忍び寄る可能性のある問題の種類のほんの一例です。
以下のジェームズの答えに関心のある関係者を指摘したかっただけです。上記の答えはCでも正しいですが、新しいC ++標準(C ++ 11)が変更され、C++およびC++11に準拠したコンパイラを使用している場合にこの警告が発行されなくなりました。
Jamesの投稿によるC++11標準から:
空ではなく、改行文字で終わらないソースファイル、またはそのようなスプライシングが行われる前にバックスラッシュ文字が直前にある改行文字で終わるソースファイルは、追加の改行文字のように処理されるものとします。改行文字がファイルに追加されました(C++11§2.2/1)。
すべてのソースファイルがエスケープされていない改行で終わるという要件は、C++11で削除されました。仕様は次のようになります。
空ではなく、改行文字で終わらないソースファイル、またはそのようなスプライシングが行われる前にバックスラッシュ文字が直前にある改行文字で終わるソースファイルは、追加の改行文字のように処理されるものとします。改行文字がファイルに追加されました(C++11§2.2/1)。
準拠するコンパイラは、この警告を発行しなくなりました(少なくとも、コンパイラに言語仕様のさまざまなリビジョンのモードがある場合、C ++ 11モードでコンパイルする場合はそうではありません)。
C++03標準[2.1.1.2]は次のように宣言しています。
...空でないソースファイルが改行文字で終わっていない場合、またはそのようなスプライシングが行われる前にバックスラッシュ文字が直前にある改行文字で終わっている場合、動作は定義されていません。
「従順」の答えは、「C++03 標準では、改行で終わらないプログラムの動作は定義されていないと述べているため」(言い換え) です。
好奇心旺盛な方への答えはhttp://gcc.gnu.org/ml/gcc/2001-07/msg01120.htmlです。
空白行を参照するのではなく、最後の行 (コンテンツを含むことができる) が改行で終了するかどうかです。
ほとんどのテキスト エディタは、ファイルの最終行の最後に改行を挿入するため、最終行に改行がない場合、ファイルが切り詰められている可能性があります。ただし、改行が必要ない正当な理由があるため、改行は単なる警告であり、エラーではありません。
#include
その行をファイルのリテラルコンテンツに置き換えます。ファイルが改行で終わらない場合、#include
それを引き込んだ を含む行は次の行とマージされます。
ファイルが改行で終わらない場合、C/C++ バージョン間で動作が異なるためです。特に厄介なのは、古い C++ バージョンです。C++ 03 の fx 標準では次のように述べられています (翻訳フェーズ)。
空でないソース ファイルが改行文字で終わらない場合、またはバックスラッシュ文字が直前にある改行文字で終わる場合、動作は未定義です。
未定義の動作は悪いことです。標準準拠のコンパイラは、多かれ少なかれ、ここで必要なことを行うことができます (悪意のあるコードを挿入するなど) - 明らかに警告の理由です。
C++11 では状況は改善されていますが、以前のバージョンで動作が定義されていない状況を回避することをお勧めします。C++03 仕様は、そのようなファイルを完全に禁止する C99 よりも悪いです (動作は定義されています)。
私は c-free IDE バージョン 5.0 を使用していますが、'c++' または 'c' 言語のいずれかのプログラムで同じ問題が発生しました。プログラムの最後、つまりプログラムの最後の行 (関数の括弧の後)メインまたは任意の機能)、 Enter -line noを押します。を 1 増やします。次に同じプログラムを実行すると、エラーなく実行されます。
この警告は、ファイルが何らかの理由で切り捨てられた可能性があることを示すのにも役立つ場合があります。コンパイラーがとにかくコンパイラー・エラーをスローすることは確かです-特にそれが関数の途中にある場合-またはおそらくリンカー・エラーですが、これらはより不可解であり、発生することが保証されていません。
もちろん、この警告は、ファイルが改行の直後に切り捨てられた場合にも保証されませんが、他のエラーが見落とされる可能性がある場合をキャッチし、問題のより強力なヒントを提供します。
これはエラーではありません。それはただの警告です。
エディターでファイルを開き、ファイルの最後の行に移動し、Enter キーを押してファイルの末尾に空白行を追加します。
#include <iostream>
ただし、それ以外に、の代わりに使用する必要があります<iostream.h>
。その後に入れusing std::cout;
ます。