我发现这个宏函数允许我在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 :(得分: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
这不是你想要的。
我不认为你期望宏如何使用变量,因为预处理器对你复杂的变量,函数和表达式几乎一无所知。它只需要文本并将其放在其他文本模板中。