为什么带整数文字的宏不适用于整数变量?

时间:2017-05-10 01:58:46

标签: c macros arm

我发现这个宏函数允许我在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编码,如果这很重要的话)

1 个答案:

答案 0 :(得分: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

这不是你想要的。

我不认为你期望宏如何使用变量,因为预处理器对你复杂的变量,函数和表达式几乎一无所知。它只需要文本并将其放在其他文本模板中。