2014-01-08 6 views
9

これはC99/C11(C++もあります)プリプロセッサとその標準準拠に関する質問です。ファイルの末尾に複数行のコメントとその埋め込み改行を前処理する

のは、2つのソースファイルを考えてみましょう:

/* I'm 
* multiline 
* comment 
*/ 

/* I'm 
* multiline 
* comment 
*/ 
i_am_a_token; 

我々は(いくつかのバージョンがテストされた)のgccや打ち鳴らすとの両方のファイルを前処理する場合は、違いがあるでしょう。最初のケースでは、プリプロセッサは複数行のコメントから改行を保持しません。 2番目のケースでは改行がすべて保持されます。

すべて言及した基準は、(どこかに「翻訳フェーズ」内)は言う:

各コメントは、1つの空白文字に置き換えられます。改行文字は保持されます。

なぜファイルの最後に複数行のコメントを扱うのに違いがありますか?この動作は標準に準拠していますか?

答えて

6

理由は簡単です - 行番号とエラー報告です。コンパイラは行番号のエラーを報告するので、前処理されたファイルの行番号が元のファイルの行番号に対応するように便利です。これは、コメントが占める行がコードの後に​​続くときに保存される理由ですが、ファイルの最後には保存する必要はありません。

標準については、標準

は、マクロなどの前処理、言語を指定しますが、それらは言語がどのように処理されるべきかを指定しないで

は、ISO/IEC 9899:2011

  • Cプログラムは、データ処理システムで使用するために変換されるメカニズムを指定しません。あなたは、C11の範囲の定義でそれを見ることができますプリプロセッサの出力は標準の範囲外で、かなり多くの内部の問題であることを意味

+0

理由はよく聞こえますが、それは標準によって許可されているか強制されていますか? – osgx

+0

@osgx良い質問 - 答えを更新しました。 – TMS

+1

@osgx私は、改行を保持する意図について@Tomasに同意します。それでも、それらを保持することは実装方法の1つに過ぎないと思われます(それらを破棄し、 '#行も発行する必要があります)ので、これを標準の問題とみなす傾向があります。実装ではありません。 – Chris

関連する問題