4

バックスラッシュの後の空白文字 (または複数の文字) について C および C++ 標準は何と言っていますか? とにかく行に参加することを保証しますか?

int main()
{
    // Comment \ 
    int foo;
}

この場合、MSVC と gcc の動作は異なります。

4

2 に答える 2

7

参考までに、標準的な引用は次のとおりです (§2.2/1、要約、強調鉱山):

翻訳の段階

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

他の回答が言及している実装定義の部分は、「改行」の定義にあります。

(コメントはフェーズ 3 まで置き換えられないことに注意してください。したがって、このコードでは次のようになります。

int main()
{
    int x = 0;

    // assuming the definition of new-line is as expected, this function
    // will return 0, not 5 (no whitespace after this backslash: ) \
    x = 5;

    return x;
}

x = 5;コメントの末尾に追加され、最終的に削除されます。)

于 2012-09-06T17:31:39.070 に答える
5

C 標準では、テキスト ファイルを行に分割する方法を実装定義のままにしています (メモリが機能する場合は、変換フェーズ 1 の一部として)。-newlineの目的で\、GCC は 0 個以上の ASCII 水平空白文字 (SPC、TAB、VT、または FF) で終わる行を定義し、その後に 3 つの一般的な ASCII 行終了シーケンス (CR、LF、または CR LF) のいずれかが続きます。

MSVC が何をするのかはわかりませんが、違っていてもまったく驚かないでしょう。

于 2012-09-06T17:28:15.163 に答える