我有下面的代码,可以在Windows中正常工作,但是在Ubuntu上我得到错误“toString1没有在这个范围内声明”。

#include <stdio.h>
#define a                    2
#define b                    3
#define c                    4
#define d                    5
#define toString1(S)         #S
#define toString(S)          toString1(S)
#define numbers              a,b,c,d
#define numbersS             toString(numbers)
int main()
{
 int a1 = 0, a2 = 0, a3 = 0, a4 = 0;
 if (sscanf_s(numbersS, "%d,%d,%d,%d", &a1, &a2, &a3, &a4) == 4)
 {
    printf("The numbers were assigned correctly");
 }
 printf("%d %d %d %d ", a1, a2, a3, a4);
}

为什么会这样?如果我移除toString1并使
#define toString(S)           #S

对于Windows和Ubuntu上的每个变量,结果都是0。
有人能解释一下吗?

最佳答案

编译器说:

 error: macro "toString1" passed 4 arguments, but takes just 1

 sscanf(numbersS, "%d,%d,%d,%d",a1,a2,a3,a4);

实际上,numbersStoString(numbers)并且数字is a,b,c,d
因此,您需要一些变量宏魔术才能正确工作:
#define a                    2
#define b                    3
#define c                    4
#define d                    5
#define toString1(S...)         #S
#define toString(S...)          toString1(S, __VA_ARGS__)
#define numbers              a,b,c,d
#define numbersS             toString(numbers)

int main()
{
    int a1,a2,a3,a4;
    sscanf(numbersS, "%d,%d,%d,%d",&a1,&a2,&a3,&a4);
    printf("%d %d %d %d", a1,a2,a3,a4);

}

在线:https://ideone.com/puPd6x
(另外,请注意,我已将sscanf固定为记录地址)

关于c - C中的字符串化运算符在Linux上不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32865828/

10-11 21:01