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我不想更改基础函数以返回字符串,所以我想出了一个主意,使用宏修改此函数的输出。有这么难吗?最后,我在函数中实现了这一点,而不是编写宏。