4

条件付きコンパイルを含む C/C++ ソース ファイルがあります。顧客に出荷する前に、ほとんどの #if ステートメントを削除して、顧客が正しい -D オプションをコンパイラに渡すことを心配する必要がないようにしたいと考えています。

これを実装して Python で動作させていますが、#ifdef および #ifndef ステートメントのみを適切に処理します。#if ステートメントのサポートを追加する必要がありますが、#if の構文ははるかに複雑です。(たとえば、&&、||、!、括弧、関係演算子、算術などを使用できます)。

#if ステートメントを解析して評価する既存のオープンソース コードはありますか? (できればPythonで)。

私が知っている唯一の実装は GCC ですが、これはこのタスクには複雑すぎます。

4

5 に答える 5

14

KeithBが言ったように、プリプロセッサにこれを任せることができます。

しかし、物事を隠そうとしない場合(つまり、条件付きでコンパイルされたコードに、他の人に与えたくないものや許可されていないものがある場合)、はるかに簡単なオプションは、単に置くことです。#defineグローバルに含まれるヘッダー内の適切なディレクティブ。

  • -Dクライアントはオプションについて心配する必要はありません
  • ビルドプロセスにカスタムステップを含める必要はありません
  • クライアントに提供するコードは、潜在的に半難読化されていません
  • ツールはCプリプロセッサとは微妙に異なることを行うため、バグは発生しません。
  • カスタムツールを維持する必要はありません
于 2008-11-13T17:02:13.647 に答える
12

Cプリプロセッサを通過させて、それで仕事をさせるのはどうですか。それらをすべて取り除くので、拡張したくないものを保護するために、プリプロセッサのステップとポストプリプロセッサのステップが必要になる場合があります。

  1. すべての #include を @include に変更します
  2. ファイルをプリプロセッサに渡す
  3. @include を #include に戻します
于 2008-11-13T16:25:25.013 に答える
8

車輪を再発明する代わりに、「unifdef」をダウンロードしてください。Linux のフレーバーを使用している場合は、おそらくそのパッケージを見つけることができます。それ以外の場合は、FreshMeatにあります。

于 2008-11-13T16:23:07.733 に答える
4

Boost.Waveを見たことがありますか?

于 2008-11-13T16:21:59.560 に答える
0

通常、GCC プリプロセッサはスタンドアロン プログラムであり、通常は と呼ばれcppます。もちろん、それはおそらくあなたのコメントも取り除くでしょう.

于 2008-11-13T16:22:24.677 に答える