0

出力テキストにすべてのマクロをそのまま残して、 C++ヘッダーファイルを前処理したいと思います。

そのためには、これらのタスクを実行するCプリプロセッサのようなプログラムが必要です。

  • #defineディレクティブからのマクロをメモリに保存します。
  • 再帰的に#includeディレクティブに従います。
  • #if#ifdefディレクティブの条件を評価します。
  • ....ブロックの非アクティブな部分のコードを抑制します#if#else#endif
  • (オプションで)コメントを削除/* .. */します。//
  • 残りのすべてのディレクティブ行を削除します。

ただし、出力でマクロを置き換えてはなりません。あるいは、プリプロセッサは、置き換えられないマクロ名のリストを引数に取ることができます。

これは奇妙に聞こえるかもしれませんが、それには十分な理由があります。前処理されたC++クラスヘッダーを分析できる一連のPerlスクリプトがあります。また、いくつかのマクロを使用して、たとえばエクスポートするメソッドを指定します。

必要なことを実行できるプリプロセッサプログラムが見つからなかったので、Perlスクリプトを作成しました。後者は実際には機能しますが、低速で標準的ではありません。私はより良い代替案を探しています。

4

2 に答える 2

2

gcc -Eプリプロセッサを手動で実行するために使用します。これによりすべてのマクロが展開されますが、問題はありません。

必要なのは、Perlスクリプトの出力が必要なときのための特別なマクロです。これを試して:

#ifdef PERL_PREPROCESSING
# define EXPORT(...) PERL_EXPORT
#else
# define EXPORT(...) ...normal C code...
#endif

gcc -E -DPERL_PREPROCESSINGつまり、 perlスクリプトが見つけられる出力を生成するために、いくつかのマクロを切り替えるために呼び出すという考え方です。マクロは通常どおり展開されます。

[編集] Perl固有のマクロでソースを汚染したくない場合は、次のトリックを使用します。Perlバージョンのマクロを含むヘッダーファイルを含むフォルダーを作成し、このフォルダーを他のすべてのフォルダーの前にインクルードします-Igccその後、標準ヘッダーファイルを無視します。

于 2012-11-22T14:31:59.263 に答える
0

* nixを使用している場合は、grepコマンドを使用して、ディレクトリ内のすべての#defineを検索できます。

grep -R . '#define'

必要な前処理には、gcc-Eを使用します。

于 2012-11-22T14:25:39.663 に答える