1

静的ライブラリをより安全にする作業が行われています。そのために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

コンパイラをだまして受け入れる方法はありますか?または、コンパイル後に文字列の名前を安全に変更する方法のより良いアイデアですか?

4

2 に答える 2

4

次のようなものを試すことができます:

#include <stdio.h>
#define PRINT(x, ...) printf(x, ##__VA_ARGS__)

int main (int argc, char *argv[]) {
    PRINT("Hello\n");
    PRINT("World %d\n", 42);
    return 0;
}

gcc 4.8 で動作します (以前のバージョンでは試していませんが、動作するはずです)。

于 2014-01-20T13:50:34.200 に答える
1

を使用する##__VA_ARGS__と、次のことを試すことができます。

#define MY_PRINTF(x, ...) \ 
    VARIADIC_DEBUG_PRINT(GENERAL_LEVEL, GENERIC_ARRAY(__COUNTER__), (void*)0, (void*)0, ##__VA_ARGS__)
于 2014-01-20T14:38:24.927 に答える