C Macro中的令牌粘贴(##)反斜杠

时间:2013-04-17 09:32:25

标签: c macros

我正在努力制作一个像这样使用的宏:

BYTE_AS_STRING(0A);

扩展为:

“\ X0A”

有可能吗?

到目前为止,我已经尝试过这个:

#define STEP2(a)               #a
#define BYTE_AS_STRING(byte)   STEP2(\x##byte)

#define STEP3(a)               #a
#define STEP2(a, b)            STEP3(\##a##b)
#define BYTE_AS_STRING(byte)   STEP2(x, byte)

没有成功。有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:1)

我要说的是,我赞同Joachim Pileborg的观点。

无论如何,这就是你需要的。您应该告诉cpp将您的宏参数视为字符串。

#include <stdio.h>

#define BYTE_AS_STRING(x)   "\\x" #x 

int main(void) {
    printf("print this : %s\n", BYTE_AS_STRING(0A));
    return 0;
}

答案 1 :(得分:0)

这似乎有效:

#define S(a)   #a
#define X(b)   S(\x##b)
#define BYTE_AS_STRING(c)   X(c)

#include <stdio.h>

int main(void)
{
    printf("%02x %s", (int)(BYTE_AS_STRING(0A)[0]), BYTE_AS_STRING(0A));
}

预处理的:

// ...
int main(void)
{
    printf("%x %s", (int)("\x0A"[0]), "\x0A");
}

Hexdump'ed输出符合预期:

$ ./a.out | hexdump -C
00000000  30 61 20 0a                                       |0a .|