c - 为什么具有整数文字的宏不适用于整数变量?

标签 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 编写代码)

最佳答案

宏不计算表达式!

它们的工作方式与函数不同,因为它们是文本替换系统,并且不计算变量或表达式。

假设我有一个简单的宏

#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

这不是你想要的。

我不明白您如何期望该宏与变量一起工作,因为预处理器对您的复杂变量、函数和表达式知之甚少。它只是获取文本并将其放入其他文本模板中。

关于c - 为什么具有整数文字的宏不适用于整数变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43882449/

相关文章:

c++ - 函数调用中char[]和char*的区别

c - 关于pthread和多线程的问题

macros - 在 Rust 中声明变量的宏?

c++ - <命令行> :0:3: warning: ISO C++11 requires whitespace after the macro name

c - 如何从交叉编译的二进制文件生成程序集?

c - 输出使用 char * 指向 int 数组

C程序-找出上面最低的学生分数,和下面的最高分数

objective-c - 绝对值(A)和绝对值(整数)

c - arm7tdmi汇编讲解+崩溃调试

c++ - 签名的二进制表示是否可以在体系结构之间移植?