免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1573 | 回复: 8
打印 上一主题 下一主题

[内核入门] 结构定义在哪? [复制链接]

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-01-17 11:36 |只看该作者 |倒序浏览
本帖最后由 _nosay 于 2017-01-17 11:38 编辑

今天看一份代码时,遇到一个疑惑,折腾了好一会才搞明白,所以记个笔记:
  1. #include <stdio.h>

  2. typedef struct real {
  3.     int n;
  4.     char c;
  5. } real;

  6. typedef struct virt virt;

  7. #define TOVIRT(o) ((virt*)o)
  8. #define TOREAL(o) ((real*)o)

  9. void fun(virt *p)
  10. {
  11.     real *r = TOREAL(p);
  12.     printf("%d, %c\n", r->n, r->c);
  13. }

  14. int main()
  15. {
  16.     real r = { 101, 'a' };

  17.     fun(TOVIRT(&r));
  18.     return 0;
  19. }
复制代码

原始代码比较庞大,看代码时经常看到virt这个结构,我就想看一下这个结构是怎么定义的:
① 直接搜搜不到;
② 怀疑是用宏组合的,因为原始代码中这个结构名字是“xx_xx”这样,有可能是“#define XX_MACRO(o) struct o##_xx {};”,但怀疑了好半天,感觉也不是;
③ 怀疑是要把代码编译一下,生成的头文件里面才有,不同的宏不断打开关闭重新编译,都还是没有找到结构的定义;
④ 发现凡是用这个结构,都是指针形式,所以写出了以上验证程序。

写程序的人,可能认为real这个名字不好,换成他喜欢的virt,所以根本不需要声明具体的结构,因为real就是这个结构,真正访问成员时,都是再转回real结构的,结果写程序的自己爽了,让看代码的人一头疑问。

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
2 [报告]
发表于 2017-01-17 11:44 |只看该作者
不过这种把不同结构的名字抽象成一个名字,有些场合应该也有用吧。。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:0015-16赛季CBA联赛之吉林
日期:2016-03-23 17:25:0015-16赛季CBA联赛之浙江
日期:2016-04-01 08:25:0615-16赛季CBA联赛之山西
日期:2016-04-01 10:09:1915-16赛季CBA联赛之广夏
日期:2016-06-03 15:58:212016科比退役纪念章
日期:2016-07-28 17:42:5215-16赛季CBA联赛之广东
日期:2017-02-20 23:32:43
3 [报告]
发表于 2017-01-17 13:39 |只看该作者
看了很久不知道你想说什么,这里代码有什么问题?

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
4 [报告]
发表于 2017-01-17 16:11 |只看该作者
回复 3# Buddy_Zhang1


这是一个陈述,不是一个问题,你仔细看过就知道,标题效仿了一下“爸爸去哪了”,不要真以为爸爸丢了

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
5 [报告]
发表于 2017-01-17 16:17 |只看该作者
回复 3# Buddy_Zhang1


就是到处看到struct virt结构的使用,但找不到struct virt结构的定义,代码量比较多时,没有一下子看出是这个原因,当时怀疑了好几个原因,所以记录了一个过程。

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:13:29
6 [报告]
发表于 2017-01-17 17:18 |只看该作者
哈哈,这个比如很恰当,爸爸真没有丢回复 4# _nosay


论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:00程序设计版块每日发帖之星
日期:2016-02-14 06:20:0015-16赛季CBA联赛之吉林
日期:2016-03-23 17:25:0015-16赛季CBA联赛之浙江
日期:2016-04-01 08:25:0615-16赛季CBA联赛之山西
日期:2016-04-01 10:09:1915-16赛季CBA联赛之广夏
日期:2016-06-03 15:58:212016科比退役纪念章
日期:2016-07-28 17:42:5215-16赛季CBA联赛之广东
日期:2017-02-20 23:32:43
7 [报告]
发表于 2017-01-17 18:31 |只看该作者
回复 5# _nosay

还是不太懂你想表达的问题。如果你想找一个函数的定义的话,直接去源码 grep 一下。
如果你怕出现你代码中的逻辑错误的话,最简单的办法,将你的 demo 程序转换成汇编,一切就明了了。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
8 [报告]
发表于 2017-01-20 10:47 |只看该作者
很少会在单个文件里这么用吧,通常会在跨接口/跨模块的时候这么用,有点OO的意思,就像sockaddr_in和sockaddr那样。
不过不知道楼主看到的代码是不是这个出发点。

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
9 [报告]
发表于 2017-01-20 12:17 |只看该作者
回复 8# nswcfd


嗯嗯,我也感受到了OO
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP