0

C++ Builder XE3 を使用しています。

現在、私は以下のようなマクロを持っています:

#define LOGG(message, ...) OTHER_LIB_LOG(message,__VA_ARGS__)

ここで、すべての引数を AnsiString にしたいと考えています。以下のような引数: メッセージを処理するのは簡単です。

#define LOGG(message, ...) OTHER_LIB_LOG(AnsiString(message),__VA_ARGS__)

しかし、VA_ARGSの場合、引数を処理して、配置されるすべての引数OTHER_LIB_LOGが AnsiString であることを確認する方法がわかりません。

のソースコードを変更するのは難しい OTHER_LIB_LOGので、マクロでこれを行う必要があります。

どんな助けでも大歓迎です。

4

1 に答える 1

2

C マクロは再帰しません。そのため、いくつかの手作業行う必要があります。 以下のように、LOGG が取り、使用する引数の最大数を見つけます。私の例では、最大 6 個の引数を取ります。

#define ENCODE0(x) AnsiString(x)
#define ENCODE1(x,...) AnsiString(x), ENCODE0(__VA_ARGS__)
#define ENCODE2(x,...) AnsiString(x), ENCODE1(__VA_ARGS__)
#define ENCODE3(x,...) AnsiString(x), ENCODE2(__VA_ARGS__)
#define ENCODE4(x,...) AnsiString(x), ENCODE3(__VA_ARGS__)
#define ENCODE5(x,...) AnsiString(x), ENCODE4(__VA_ARGS__)
#define ENCODE6(x,...) AnsiString(x), ENCODE5(__VA_ARGS__)
//Add more pairs if required. 6 is the upper limit in this case.
#define ENCODE(i,...) ENCODE##i(__VA_ARGS__) //i is the number of arguments (max 6 in this case)

#define LOGG(count,...) OTHER_LIB_LOG(ENCODE(count,__VA_ARGS__))

サンプル使用法:LOGG(5,"Hello","Hi","Namaste _/\_","Hola!","bonjour");

于 2012-12-14T05:35:56.397 に答える