C 宏调用返回整数的函数,然后返回字符串
我有一个返回整数值的函数。现在我想写一个宏来调用这个函数,获取返回值,并在它前面加上一个字符串,然后返回结果字符串 我试过这个:C 宏调用返回整数的函数,然后返回字符串,c,function,macros,C,Function,Macros,我有一个返回整数值的函数。现在我想写一个宏来调用这个函数,获取返回值,并在它前面加上一个字符串,然后返回结果字符串 我试过这个: #define TEST(x) is_enabled(x) 我在main函数中将此宏称为: int ret = 0; ret = TEST(2); printf("PORT-%d\n", ret); printf("PORT-%d\n", TEST(2)); 这很好用。但是,我希望宏返回字符串PORT-x,其中x是被调用函数的返回值。我该怎么做 编
#define TEST(x) is_enabled(x)
我在main函数中将此宏称为:
int ret = 0;
ret = TEST(2);
printf("PORT-%d\n", ret);
printf("PORT-%d\n", TEST(2));
这很好用。但是,我希望宏返回字符串PORT-x,其中x是被调用函数的返回值。我该怎么做
编辑:
我还尝试将其写入多行,如下所示:
#define TEST(x)\
{\
is_enabled(x);\
}
并在主函数中将其称为:
int ret = 0;
ret = TEST(2);
printf("PORT-%d\n", ret);
printf("PORT-%d\n", TEST(2));
但这会产生编译时错误:
error: expected expression before â{â token
使用函数,而不是宏。这里没有充分的理由使用宏 您可以使用
sprintf(3)
,结合malloc或缓冲区来解决这个问题。有关详细信息,请参阅或手册页
关于编辑:不需要在宏中使用大括号{}
,它们会导致错误,因为预处理会将其转换为
printf("format%d", {
is_enabled(x);
});
要更好地理解宏,请运行gcc或带有-E标志的clang,或者尝试阅读本文:这有点麻烦,因为您需要确保字符串有存储空间。老实说,现在的宏只能用于条件编译 常量最好使用枚举类型,宏函数作为内联函数通常更好(知道
inline
是对编译器的建议,而不是要求)
如果坚持使用宏,则可以使用静态存储来完成存储,尽管在使用线程时线程会出现问题,并且会延迟/多次使用返回的字符串
您还可以动态分配字符串,但完成后必须释放它,并处理内存不足的情况
也许最简单的方法是要求宏用户提供自己的存储,大致如下:
#include <stdio.h>
#define TEST2_STR(b,p) (sprintf(b,"PORT-%d",p),b)
int main (void) {
char buff[20];
puts (TEST2_STR(buff, 42));
return 0;
}
如果宏看起来有点混乱,它会使用逗号运算符,其中表达式(a,b)
计算a
和b
,结果为b
在这种情况下,它计算sprintf
(填充缓冲区),然后“返回”缓冲区。而且,即使你认为你以前从未见过,你可能错了:
for (i = 0, j = 9; i < 10; i++, j--)
xyzzy[i] = plugh[j];
(等等)。可以通过编写一个“调用”
sprintf
的宏来完成,但您需要分配一个缓冲区并将其传递给该宏。问题是,你为什么要从这个开始?因为感觉好像你在用错误的方式解决问题。为什么不能使用strcat?为什么需要一个宏?你肯定应该为此编写一个函数…@Gopi我不想更改基础函数以返回字符串,所以我想出了一个主意,使用宏修改此函数的输出。有这么难吗?最后,我在函数中实现了这一点,而不是编写宏。