9

私の知る限り\、C では、改行がないかのように次の行を追加するだけです。

次のコードを検討してください。

main(){\
return 0;
}

前処理されたコード( gcc -E)を見ると、それが表示されます

main(){return
       0;
}

そしてそうではない

main(){return 0;
}

この種の行動の理由は何ですか?また、どうすれば期待したコードを取得できますか?

4

3 に答える 3

10

K&R セクション A.12 Preprocessingから:

A.12.2 ラインスプライシング

バックスラッシュ文字 \ で終わる行は、バックスラッシュとそれに続く改行文字を削除することによって折り畳まれます。これは、トークンへの分割の前に発生します。

于 2013-06-25T06:57:28.467 に答える
4

関係ありません:/ トークナイザーは違いを認識しません。1

更新コメントに応じて:

プリプロセッサの期待される出力がどうあるべきかについて、かなりの混乱があるようです。私の要点は、期待は/一見/妥当に見えますが、出力を有効にするために実際にこのように指定する必要はないということです。出力に含まれる空白の量は、パーサーにはまったく関係ありません。重要なのは、プリプロセッサが解釈中に継続行を 1 行として扱う必要があるということです。

つまり、プリプロセッサはテキスト変換ツールではなく、トークン操作ツールです。

それがあなたにとって重要なら、あなたはおそらく

  • C/C++ 以外のプリプロセッサの使用
  • C++ コードをテキストとして扱います。これは ... コードの匂いです。(libclang やさまざまな不完全なパーサー ライブラリが思い浮かびます)。

1 (プリプロセッサは、適切と思われる方法で指定された結果を自由に達成できます。表示されている結果は、実装者がこの特定の変換を実装するために見つけた最も効率的な方法である可能性があります)

于 2013-06-25T06:54:08.047 に答える