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;
}