- 论坛徽章:
- 13
|
本帖最后由 _nosay 于 2017-01-17 11:38 编辑
今天看一份代码时,遇到一个疑惑,折腾了好一会才搞明白,所以记个笔记:
- #include <stdio.h>
- typedef struct real {
- int n;
- char c;
- } real;
- typedef struct virt virt;
- #define TOVIRT(o) ((virt*)o)
- #define TOREAL(o) ((real*)o)
- void fun(virt *p)
- {
- real *r = TOREAL(p);
- printf("%d, %c\n", r->n, r->c);
- }
- int main()
- {
- real r = { 101, 'a' };
- fun(TOVIRT(&r));
- return 0;
- }
复制代码
原始代码比较庞大,看代码时经常看到virt这个结构,我就想看一下这个结构是怎么定义的:
① 直接搜搜不到;
② 怀疑是用宏组合的,因为原始代码中这个结构名字是“xx_xx”这样,有可能是“#define XX_MACRO(o) struct o##_xx {};”,但怀疑了好半天,感觉也不是;
③ 怀疑是要把代码编译一下,生成的头文件里面才有,不同的宏不断打开关闭重新编译,都还是没有找到结构的定义;
④ 发现凡是用这个结构,都是指针形式,所以写出了以上验证程序。
写程序的人,可能认为real这个名字不好,换成他喜欢的virt,所以根本不需要声明具体的结构,因为real就是这个结构,真正访问成员时,都是再转回real结构的,结果写程序的自己爽了,让看代码的人一头疑问。
|
|