gpt4 book ai didi

c - 如何编写执行 malloc、格式化字符串然后返回格式化字符串的宏?

转载 作者:太空宇宙 更新时间:2023-11-04 07:33:32 27 4
gpt4 key购买 nike

我试过这个:

#define format(f, ...) \
int size = strlen(f) + (sizeof((int[]){__VA_ARGS__})/sizeof(int)) + 1); \
char *buf = malloc(size); \
snprintf(buf, size, f, __VA_ARGS__); \
buf

但是它返回了很多语法错误。我该如何正确执行此操作?

最佳答案

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}) 这将在本地范围内执行所有语句,然后分配 statementNmystring。然而,它会使您的代码不可移植并且难以调试。

好了,但请不要在实际应用中使用它:

#define format(f, ...) \
({ int size = snprintf(NULL, 0, f, __VA_ARGS__) + 1;\
char * buf = malloc(size);\
snprintf(buf, size, f, __VA_ARGS__); buf; })

我是认真的。不要用这个。使用内联函数。您还可以在普通函数中使用可变参数,使用 va_argva_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 - 如何编写执行 malloc、格式化字符串然后返回格式化字符串的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10999523/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com