整理一个退休的工程师代码,我遇到了一个相当简单的宏,但我的C知识不是很好。
#define mem32(addr) (*(unsigned long volatile *)(addr)) 发布于 2016-01-13 19:02:29
是。
*(unsigned long volatile *)(addr)正在对addr进行类型转换,然后取消引用。
不是的。秩序不重要。C11节第6.7.2/2节
..。类型说明符可能以任何顺序出现,可能与其他声明说明符混合。..。
发布于 2016-01-13 19:15:11
强制(unsigned long volatile *)(addr)发生在取消引用之前。
不,只要没有进一步的操作符,单词unsigned、long和volatile的顺序就不重要了。也就是说,volatile int*和int volatile*是一样的,但是int * volatile是不同的。
在较高级别上,这个宏的目的是获取任何指针,并从该内存地址读取前四个字节。
但是,如果传递给的指针既不是指向long或char的指针,则会调用未定义的行为!这是由于严格的混叠规则。以前的编译器用来安全地为这个宏生成预期的代码,但是现代编译器可能只是使用该宏来优化代码,如果它们被证明是类型不匹配的话。所以,不要在新代码中使用这个。
https://stackoverflow.com/questions/34774888
复制相似问题