2013-04-17 35 views
0

我在努力制作这样一个宏:C宏中的令牌粘贴(##)反斜杠

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) 

没有成功。有任何想法吗?

谢谢。

+1

你为什么要那样做?当你的意思是只写'“\ x0a”'时,会不会更简单(并且更具可读性)? –

+0

哼......看着答案,我不确定你现在的真实含义。您是否确实将宏展开为“\ x0a”或“\\ x0a”? (即换行,或文字'反斜杠x零a'?) – Mat

回答

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 .| 
+0

感谢马特,但它没有在我的编译器工作,我正在编程一个微控制器,虽然编译器说它是ANSI C,我认为它可能是错误。我知道这个问题似乎很少见,但我串联字符串,我想插入像这样的字节:“你好”BYTE_AS_STRING(AA)“世界”得到一个串联的字符串,因为它是这样键入“你好\ xAA世界”知道我将在内存中获取字节[0xAA]而不是[Backslask] [x] [A] [A] – user2289948

1

我会说,我分享约阿希姆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; 
}