首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型铸造指针取消引用

类型铸造指针取消引用
EN

Stack Overflow用户
提问于 2016-01-13 18:59:05
回答 2查看 729关注 0票数 2

整理一个退休的工程师代码,我遇到了一个相当简单的宏,但我的C知识不是很好。

代码语言:javascript
复制
#define mem32(addr) (*(unsigned long volatile *)(addr)) 
  1. 我是否正确地将此称为类型转换指针取消引用?
  2. 它类型转换为addr,然后删除它?还是反过来?有关系吗?
  3. 类型限定符和类型说明符的顺序重要吗?我假设(在此之前)类型限定符必须先于类型说明符,但不能这样。
  4. 语法问题。2号的目的是什么?
EN

回答 2

Stack Overflow用户

发布于 2016-01-13 19:02:29

  1. 我是否正确地将此称为类型转换指针取消引用?

是。

  1. 它类型转换为addr,然后删除它?还是反过来?有关系吗?

*(unsigned long volatile *)(addr)正在对addr进行类型转换,然后取消引用。

  1. 类型限定符和类型说明符的顺序重要吗?

不是的。秩序不重要。C11节第6.7.2/2节

..。类型说明符可能以任何顺序出现,可能与其他声明说明符混合。..。

票数 1
EN

Stack Overflow用户

发布于 2016-01-13 19:15:11

强制(unsigned long volatile *)(addr)发生在取消引用之前。

不,只要没有进一步的操作符,单词unsignedlongvolatile的顺序就不重要了。也就是说,volatile int*int volatile*是一样的,但是int * volatile是不同的。

在较高级别上,这个宏的目的是获取任何指针,并从该内存地址读取前四个字节。

但是,如果传递给的指针既不是指向longchar的指针,则会调用未定义的行为!这是由于严格的混叠规则。以前的编译器用来安全地为这个宏生成预期的代码,但是现代编译器可能只是使用该宏来优化代码,如果它们被证明是类型不匹配的话。所以,不要在新代码中使用这个。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34774888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档