5

他に何も変更せずにソースコードからいくつかの#defineステートメントをフィルタリングするCプリプリプロセッサが必要です。

なんで?これは、ソースが別のクライアントに渡された場合に、ソースからクライアント固有のコードを削除するために使用する必要があります。

誰かが既存のソリューションを知っていますか?

ありがとう!サイモン

4

9 に答える 9

9

CPP の代わりに awk のようなものを使用できますか? 削除するコード部分を囲むいくつかのフラグをコードに追加します。例えば:

(...)
//BEGIN_REMOVE_THIS_CODE

printf("secret code");

//END_REMOVE_THIS_CODE
(...)

次に、このコードを削除する awk スクリプトを作成します。

BEGIN { write=1;}
/^\/\/BEGIN_REMOVE_THIS_CODE/ { write=0; next;}
/^\/\/END_REMOVE_THIS_CODE/ { write=1; next;}
    {
    if(write==1) print $0;
    }
于 2009-09-15T11:12:29.367 に答える
2

これは、私が質問したように聞こえます。定義された値に基づいてifdefブロックを削除するCプリプロセッサはありますか。私が得た最良の答えはsunifdef、または「Son of unifdef」でした。これは、過度に歪んだ条件付きコード(さまざまなプラットフォームでの20年以上の開発から蓄積されたクラッドで、実行方法の理論が不十分です)で確実に機能しました。プラットフォーム固有のコンパイル)。

于 2009-09-15T14:04:16.853 に答える
2

fileppなど、コードのフィルタリングに追加のマクロ言語レイヤーを使用することをお勧めします。どのパーツがどのクライアントに属しているかを表現するために、C プリプロセッサに適した構文を使用できます。

//%ifdef CLIENT_A
  code for client A
//%endif

//%ifdef CLIENT_B
  code for client B
//%endif

//%if "CLIENT_A" || "CLIENT_B"
  code for client A and B
//%endif

「//%」プレフィックスを使用すると、コードを変更せずにコンパイルできます。クライアントにコードを配布する前に、fileppを実行することができます。

于 2009-09-15T13:19:03.540 に答える
1

このためにプリプロセッサは必要ないと思います。#ifdefコードにネストされたがない場合、正規表現エンジンはとの間#ifdef CLIENTにあるものをすべて削除できます(欲張りでない一致を使用して、最後ではなく#endif最初に一致させます)。#endif

于 2009-09-15T11:11:14.483 に答える
1

クライアント固有のコードを別のディレクトリに配置するか、ソース管理からチェックアウトする必要がある別のプロジェクトの一部に配置します。

別の関数をその場所に配置できるように、スタブ化されるか、または (適切な用語を忘れました) 疎にリンクされる関数呼び出しを配置し​​ます。

于 2009-09-15T12:43:47.420 に答える
0

また、sunifdefよりも単純なunifdefを試すこともできます。

于 2010-01-18T21:09:48.757 に答える
0

gcc を使用している場合は、次を使用できます。

gcc <insert files here> -E

-E オプションは、ソースを前処理するだけで、コンパイルしないように gcc に指示します。

または、grep を使用して特定のファイルを除外し、プリプロセッサにそれらのファイルのみを解放させることもできます。

grep -r '#define CLIENT_CODE' ./*.h 
于 2009-09-15T11:11:53.640 に答える
-2

私の知る限り...プリプロセッサは別のステップとして実行できます(正しいコンパイラオプションを使用)。このようにして、処理されたコードで好きなことを行うことができます。

于 2009-09-15T11:12:43.423 に答える