2

我有这个C宏:

#define syscall(number) \
({ \
    asm volatile ( \
        ".set noreorder\n" \
        "nop\n" \
        "syscall "#number"\n" \
    );\
})

当我用整数调用它时效果很好:

 syscall(5);

但是,当我做这样的事情时:

 #define SYSCALL_PUTC 5

 syscall(SYSCALL_PUTC);

我收到此错误:

错误:指令系统调用需要绝对表达式

我该如何解决这个问题?我不想让我的代码到处都是幻数。

4

2 回答 2

4

像这样使用字符串化

#define xstr(s) str(s)
#define str(s) #s
#define syscall(number) \
({ \
    asm volatile ( \
        ".set noreorder\n" \
        "nop\n" \
        "syscall "xstr(number)"\n" \
    );\
})

有关字符串化的更多信息,请参阅此 gcc 页面:

http://gcc.gnu.org/onlinedocs/cpp/Stringification.html

于 2012-01-08T17:14:06.277 回答
0

有点小技巧,但不多:为每个系统调用号复制原始系统调用宏,并为该系统调用命名。因此,您将拥有一个名为 SYSCALL_PUTC 的宏,该宏将扩展为与 syscall(5) 相同的宏。

于 2012-01-08T17:09:12.040 回答