我有下面的代码,可以在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);
实际上,
numbersS
是toString(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/