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