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
和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;
}
我能插一句說,你真的不應該比學習如何在C預作品以外的任何理由這樣做呢? – djechlin
..還寫下你得到的確切的錯誤? – 2012-06-12 15:13:55