繁体   English   中英

C中的棘手宏

[英]Tricky Macro in C

我对PowerPC有这样的说法,但不知道它是如何工作的

#define XOR(A,D) (*(volatile unsigned int*)(volatile void*)((unsigned char*)0UL + (A)) ^= (D))

被称为(例如)

unsigned int a = 3;
unsigned int b = 50;
XOR((unsigned int)&a,b);

使用标准PC的gcc不能编译,在我的环境中可以编译,所以我问自己:wtf ...

对于切换硬编码地址上的位,这似乎是不必要的卷积宏。 这些地址可能是内存映射的寄存器地址。 这里的AD是线索: A =地址, D =数据。 因此,通常,如果您在地址0x100处有一个寄存器,并且想要切换其最低有效位,则可能会编写如下内容:

XOR(0x100, 0x01);

一个简单得多的版本是:

#define XOR(A, D) ((*(volatile int *)(A)) ^= (D))

目前尚不清楚为什么原始作者使用多次强制转换并将硬编码地址添加到NULL指针中。 猜测,前者可能是为了摆脱编译器警告,后者可能是在某个时候允许使用不同的寄存器基地址。

这是一种难以理解的写作方式

*(volatile uint32_t*)a ^= b;

(我之所以选择uint32_t,是因为它说CPU是PowerPC)

每当您看到有人试图用他们自己晦涩的宏语言重新发明C语言时,您都可以肯定该程序的质量令人怀疑。 在这种情况下,很明显,程序员对于C的工作方式非常不安全,我对他们的其余代码充满怀疑。

在这种情况下,请勿使用类似函数的宏。

额外的转换是减少MISRA检查警告。 是参考。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM