2

私はこのCマクロを持っています:

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

整数で呼び出すとうまく機能します。

 syscall(5);

しかし、私がこのようなことをするとき:

 #define SYSCALL_PUTC 5

 syscall(SYSCALL_PUTC);

このエラーが発生します:

エラー:命令syscallには絶対式が必要です

これを回避するにはどうすればよいですか?コードに魔法数を散らかしたくありません。

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 番号ごとに元の syscall マクロのコピーを作成し、それぞれにその syscall の名前を付けます。したがって、syscall(5) と同じように展開される SYSCALL_PUTC という名前のマクロが作成されます。

于 2012-01-08T17:09:12.040 に答える