静的ライブラリをより安全にする作業が行われています。そのためにprintf
は、コンパイルされた静的ライブラリで異なるように表示されるように、書式設定された文字列を置き換える必要があります。これを行うには、プリプロセッサで行う必要があります。ステージ。
私がやったこと(そしてそれは実際にビジュアルスタジオで動作します)は次のとおりです(そしてそれは単なる疑似例です):
char * my_array[] = {"abcd", "a %d", " b %d %s "};
#define GENERIC_ARRAY(x) my_array[x]
#define VARIADIC_DEBUG_PRINT(...) DebugPrintFunction (__FILE__, __LINE__, __func__, __VA_ARGS__)
#define PRINT_BY_LEVEL(x) VARIADIC_DEBUG_PRINT x
#define REPLACE_STRING(x,...) PRINT_BY_LEVEL((GENERAL_LEVEL,GENERIC_ARRAY(__COUNTER__),__VA_ARGS__))
#define MY_PRINTF(x,...) REPLACE_STRING((void*)0,(void*)0,__VA_ARGS__)
このオーバーヘッドはすべて、文字列以外の引数なしで印刷を受け入れるようにコンパイラをだますためのものです
したがって、main.cでテストするときに、次のことを試してみましたが、うまくいきました:
MY_PRINTF("Hello World");
MY_PRINTF("My Val %d", i);
MY_PRINTF("MY VAL %d My String %s", i, s);
しかし、GCC に切り替えたとき、彼は最初の出力の形式が気に入らなかった、つまり:
MY_PRINTF("Hello World");
そして私にコンパイルエラーをスローします:
error: expected expression before ')' token
コンパイラをだまして受け入れる方法はありますか?または、コンパイル後に文字列の名前を安全に変更する方法のより良いアイデアですか?