0

私は2つのフェーズでCプリプロセッサを実装することを検討しています。最初のフェーズでは、ソースファイルを前処理トークンの配列に変換します。プロジェクト内の複数のファイルにヘッダーファイルが含まれている場合、トークン化の作業をやり直す必要がないため、これは単純さとパフォーマンスに適しています。

障害:

#define f(x) #x
main() {
    puts(f(a+b));
    puts(f(a + b));
}

標準によると、出力は次のようになります。

a+b
a + b

つまり、構成トークンが空白で区切られているかどうかに関する情報は保持されることになっています。これには、2フェーズ設計を廃棄する必要があります。

これまで見てきた#演算子の使用は、実際にはこれを必要としません。たとえば、構成トークンがソースファイル内で空白で区切られているかどうかに関係なくassert、出力が常に正常である場合は、引き続き正常に機能します。a + b

この演算子の標準で規定されている正確な動作に依存する既存のコードはありますか?

4

1 に答える 1

1

コンパイラコース用のANSICコンパイラの例として記述されているLCCコンパイラのプリプロセッサを確認することをお勧めします。もう1つのプリプロセッサはMCPPです。

C / C ++の前処理は非常に注意が必要です。それに固執する場合は、少なくとも関連する標準のドラフトを取得し、どこかでテストスイートを盗むようにしてください。

于 2013-01-20T03:55:46.803 に答える