6

翻訳フェーズ 2 の 2 番目の部分 ( N3485のセクション 2.2.2 ) では、基本的に、ソース ファイルが改行文字で終わっていない場合、コンパイラは改行文字で終わっているかのように処理する必要があると述べています。

ただし、正しく読んでいれば、空のソースファイルに対して明示的な例外が発生し、空のままになります。

正確なテキスト (強調を追加) は次のとおりです。

\直後に改行文字が続くバックスラッシュ文字 ( ) の各インスタンスが削除され、物理ソース行が結合されて論理ソース行が形成されます。物理ソース行の最後のバックスラッシュのみが、そのようなスプライスの一部として適格です。その結果、汎用文字名の構文に一致する文字シーケンスが生成された場合、動作は未定義です。空ではなく、改行文字で終わらないソース ファイル、またはそのようなスプライシングが行われる直前にバックスラッシュ文字が直前にある改行文字で終わるソース ファイルは、追加の new-行文字がファイルに追加されました

ソース ファイルが空であるか、改行文字だけで構成されているかによって違いが生じる状況を特定できませんでした。

誰かがこの要件の背後にある理由に光を当てることができることを願っています.

4

5 に答える 5

5

これは、世界最小の自己複製プログラムである「ルールの最悪の乱用」のカテゴリで、1994年に難読化された国際Cコードコンテストで優勝したエントリを具体的にサポートするためのものです。保証されています。

于 2013-02-20T00:14:47.923 に答える
2

ソースファイルは通常0行以上で構成され、各行は改行文字以外の文字のシーケンスとそれに続く改行で構成されているという考え方だと思います。その要件を満たしていないソースファイルには、特別な処理が必要です(したがって、2つの異なるソースファイルからのテキストで構成される行を取得することはありません)。

空のC++ソースファイルは特に有用ではありませんが、それを禁止する意味はありません。引用された句は、空のファイルと1つの改行だけで構成されるファイルを区別することではありません(それらの間に実際の違いはないはずです)。

于 2013-02-20T00:15:12.293 に答える
2

これは、すべての行が \n で終わることを意味すると思いますが、空のファイルには行がありません

于 2013-02-20T00:34:14.053 に答える
1

プリプロセッサは、プログラムソース以外のものを構築するために使用でき、空白行は重要な場合があります。たとえば、テキスト内の段落を区切るためによく使用されます。

于 2013-02-20T00:10:16.963 に答える
0

「空ではなく、改行文字で終わらないソース ファイル、またはスプライシングが行われる直前にバックスラッシュ文字が直前にある改行文字で終わるソース ファイルは、追加の新しいファイルとして処理されます。 -line 文字がファイルに追加されました。」

翻訳フェーズ 2 の 2 番目の部分 (N3485 のセクション 2.2.2) では、基本的に、ソース ファイルが改行文字で終わっていない場合、コンパイラは改行文字で終わっているかのように処理する必要があると述べています。

いいえ - ファイルが「空ではない」かつ改行で終わらない場合、改行が追加されます。

ただし、正しく読んでいれば、空のソースファイルに対して明示的な例外が発生し、空のままになります。

同意した。

ソースファイルが空であるか、改行文字のみで構成されているかによって違いが生じる状況を特定できませんでした。誰かがこの要件の背後にある理由に光を当ててくれることを願っています。

以下のように最後の行があり、末尾に改行がない「header.h」というヘッダー ファイルを考えてみましょう。

#endif  // #ifndef INCLUDED_HEADER_H

another.cc に次のようにインクルードするとします。

#include "header.h"
#include "another.h"

another.cc が解析されると、header.h のテキストが、その包含を指定する行に置き換えられます。単純に行うと、次のようになります。

#endif  // #ifndef INCLUDED_HEADER_H#include "another.h"

明らかに、コンパイラは#include "another.h"、header.h で開始されたコメントの一部であると見なして、 に対処できません。

したがって、不完全なルールのルールは、これらの問題を回避します (これは非常に見つけにくい場合があります)。

いずれにせよファイルが空だった場合、この問題はマニフェストにはなりません:#endifインクルード ファイルの次の行に のようなものはありません....

于 2013-02-20T01:27:23.577 に答える