我有 C 宏:
#define syscall(number) \
({ \
asm volatile ( \
".set noreorder\n" \
"nop\n" \
"syscall "#number"\n" \
);\
})
当我用整数调用它时效果很好:
syscall(5);
然而,当我做这样的事情时:
#define SYSCALL_PUTC 5
syscall(SYSCALL_PUTC);
我收到此错误:
错误:指令系统调用需要绝对表达式
我该如何解决这个问题?我不希望我的代码充斥着神奇的数字。
答案 0 :(得分:4)
使用 stringification ,如下所示:
#define xstr(s) str(s)
#define str(s) #s
#define syscall(number) \
({ \
asm volatile ( \
".set noreorder\n" \
"nop\n" \
"syscall "xstr(number)"\n" \
);\
})
有关字符串化的更多信息,请参阅此gcc页面:
答案 1 :(得分:0)
有点破解,但不是那么多:为每个系统调用号创建原始系统调用宏的副本,为每个系统调用命名。因此,您将拥有一个名为SYSCALL_PUTC的宏,它将扩展为与syscall(5)相同的宏。