2017-05-10 52 views
0

我发现这个微距功能,可以让我在C.创建二进制文字为什么宏整型文字不能用于整型变量?

微距功能:

#define HEX__(n) 0x##n##LU 
#define B8__(x) ((x&0x0000000FLU)?1:0) \ 
+((x&0x000000F0LU)?2:0) \ 
+((x&0x00000F00LU)?4:0) \ 
+((x&0x0000F000LU)?8:0) \ 
+((x&0x000F0000LU)?16:0) \ 
+((x&0x00F00000LU)?32:0) \ 
+((x&0x0F000000LU)?64:0) \ 
+((x&0xF0000000LU)?128:0) 

#define B8(d) ((unsigned char)B8__(HEX__(d))) 
#define B16(dmsb,dlsb) (((unsigned short)B8(dmsb)<<8) + B8(dlsb)) 
#define B32(dmsb,db2,db3,dlsb) \ 
(((unsigned long)B8(dmsb)<<24) \ 
+ ((unsigned long)B8(db2)<<16) \ 
+ ((unsigned long)B8(db3)<<8) \ 
+ B8(dlsb)) 

它工作正常,但是当我试图将一个int变量的宏功能,它给我一个后缀错误。

int i=10001000; 
B8(i); //invalid suffix 'xiLU' on integer constant 
B8(10001000); //no error 

任何想法? (也请注意,我在TI TM4C LaunchPad上用C编码,如果有的话)

+0

细节:在C中,'10001000'是一个_integer常量_。 C指定了2个_literals_:_string文字_和_compound文字_。 '10001000'也不是他们的 – chux

+1

代码初始化'i'为'10001000'的值。你期望下一行'B8(i);'做什么? – chux

+0

@chux它会产生与最后一行相似的结果。我假设我不能通过我得到的回应来做到这一点。 –

回答

6

宏不评估表达式!

它们与函数不同,因为它们是文本替换系统,不会评估变量或表达式。

比方说,我有一个简单的宏

#define HEX_TO_DEC(num) 0x##num 

,我可以使用这样的:

unsigned hexValue_1 = HEX_TO_DEC(5310B00B); 
unsigned hexValue_2 = HEX_TO_DEC(DEADBEEF); 

这将扩展到这一点:

unsigned hexValue_1 = 0x5310B00B; 
unsigned hexValue_2 = 0xDEADBEEF; 

而这一切,罚款和好。现在这个扩展到什么,你觉得呢?

unsigned i = 2345; 
unsigned hexValue_3 = HEX_TO_DEC(i); // ? 

因为宏替代文本,而不是值,它扩展到这一点:

unsigned i = 2345; 
unsigned hexValue_3 = 0xi; // compile error 

这不是你想要的。

我不明白你是如何期待这个宏与一个变量一起工作的,因为预处理器对你的复杂变量,函数和表达式没有什么想法。它只是将文本放入其他文本模板中。

+0

我现在看到。谢谢你解释。 –

+0

*因为它们基本上是一个黑客文本替换系统*。他们绝不会冒昧。 –