c - 这在 C ((TYPE){}) 中意味着什么。该片段取自: __typeof__ ( ((TYPE){}).MEMBER )
问题描述
#define _IO_MEMBER_TYPE (type, member) \
__typeof__ ( ((TYPE){}).MEMBER )
我已经在 glibc 的头文件“libiop.h”中阅读了这一行,我对 (TYPE) 之后的大括号 {} 有点困惑。是什么( (TYPE){} )
意思?
解决方案
宏表示特定结构成员的类型。该评论试图解释这一点:
/* Type of MEMBER in struct type TYPE. */
#define _IO_MEMBER_TYPE(TYPE, MEMBER) __typeof__ (((TYPE){}).MEMBER)
该宏仅在此处使用:
/* Essentially ((TYPE *) THIS)->MEMBER, but avoiding the aliasing
violation in case THIS has a different pointer type. */
#define _IO_CAST_FIELD_ACCESS(THIS, TYPE, MEMBER) \
(*(_IO_MEMBER_TYPE (TYPE, MEMBER) *)(((char *) (THIS)) \
+ offsetof(TYPE, MEMBER)))
此构造使用各种 GCC 扩展来实现 C++ 样式的类继承。对于最近的 GCC 版本,直接编写此方法不再有效(或触发警告)。(libio
它实现的代码和 C++ ABI 可以追溯到 90 年代的 GCC 2.95。)
这段代码非常糟糕,你真的不应该将它用作任何东西的模型。
推荐阅读
- php - 将 10e-3 转换为十进制
- python - 在 matlab/python 中创建特定的颜色图
- laravel - 以多个间隔运行 Laravel CRON 调度程序
- seo - ???在页面标题中 - Craft CMS
- sql - 需要通过 SQL 获取 - 从今天起 1 个月,显示拥有最多(用户)授权的日期
- python - 使用 Statsmodels 的 summary_col 函数时出现长度不匹配错误
- laravel - Laravel cURL 错误 28,将文件上传到 aws s3 存储桶时
- javascript - React Native Onesignal:应用程序在前台时重新启动捆绑包,ANDROID
- docker - “如果您看到此 Grafana 无法加载其应用程序文件”反向代理后面的 Docker Grafana 部署错误
- javascript - 内部订阅的Angular 6等待方法