他に何も変更せずにソースコードからいくつかの#defineステートメントをフィルタリングするCプリプリプロセッサが必要です。
なんで?これは、ソースが別のクライアントに渡された場合に、ソースからクライアント固有のコードを削除するために使用する必要があります。
誰かが既存のソリューションを知っていますか?
ありがとう!サイモン
他に何も変更せずにソースコードからいくつかの#defineステートメントをフィルタリングするCプリプリプロセッサが必要です。
なんで?これは、ソースが別のクライアントに渡された場合に、ソースからクライアント固有のコードを削除するために使用する必要があります。
誰かが既存のソリューションを知っていますか?
ありがとう!サイモン
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;
}
これは、私が質問したように聞こえます。定義された値に基づいてifdefブロックを削除するCプリプロセッサはありますか。私が得た最良の答えはsunifdef
、または「Son of unifdef」でした。これは、過度に歪んだ条件付きコード(さまざまなプラットフォームでの20年以上の開発から蓄積されたクラッドで、実行方法の理論が不十分です)で確実に機能しました。プラットフォーム固有のコンパイル)。
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を実行することができます。
このためにプリプロセッサは必要ないと思います。#ifdef
コードにネストされたがない場合、正規表現エンジンはとの間#ifdef CLIENT
にあるものをすべて削除できます(欲張りでない一致を使用して、最後ではなく#endif
最初に一致させます)。#endif
クライアント固有のコードを別のディレクトリに配置するか、ソース管理からチェックアウトする必要がある別のプロジェクトの一部に配置します。
別の関数をその場所に配置できるように、スタブ化されるか、または (適切な用語を忘れました) 疎にリンクされる関数呼び出しを配置します。
また、sunifdefよりも単純なunifdefを試すこともできます。
gcc を使用している場合は、次を使用できます。
gcc <insert files here> -E
-E オプションは、ソースを前処理するだけで、コンパイルしないように gcc に指示します。
または、grep を使用して特定のファイルを除外し、プリプロセッサにそれらのファイルのみを解放させることもできます。
grep -r '#define CLIENT_CODE' ./*.h
私の知る限り...プリプロセッサは別のステップとして実行できます(正しいコンパイラオプションを使用)。このようにして、処理されたコードで好きなことを行うことができます。