C マクロは関数ではなく、1:1 置換です。したがって、次のようにマクロを使用する場合:
mystring = format("%d", 5);
あなたはこれを得る:
mystring = int size = strlen(f) + (sizeof((int[]){5})/sizeof(int)) + 1); \
char *buf = malloc(size); \
snprintf(buf, size, f, 5); \
buf;
これは意味がありません。あなたの場合、まともなコンパイラでのパフォーマンスの点でこれ以上悪くならないインライン関数を定義する方が良いでしょう。
本当にマクロである必要があり、GCC を使用している場合は、複合ステートメントを使用して目的を達成できます。これにより、mystring = ({ statement1, statement2, ..., statementN})
すべてのステートメントがローカル スコープで実行され、次に に割り当てstatementN
られmystring
ます。ただし、コードが移植できなくなり、デバッグが困難になります。
というわけで、実際のアプリケーションでは使用しないでください。
#define format(f, ...) \
({ int size = snprintf(NULL, 0, f, __VA_ARGS__) + 1;\
char * buf = malloc(size);\
snprintf(buf, size, f, __VA_ARGS__); buf; })
私は真剣です。これを使用しないでください。インライン関数を使用します。va_arg
andを使用して、通常の関数で可変引数を使用することもできますva_start
。
inline char * format(f, ...) {
va_list args;
va_start(args, f);
int size = vsnprintf(NULL, 0, f, args) + 1;
char * buf = malloc(size);
vsnprintf(buf, size, f, args);
return buf;
}