C_and_CPP 板


LINE

website: https://en.wikipedia.org/wiki/Opaque_pointer#C 上网查了一下,opaque pointer主要是用来hide implementation,也就是作了一个encap- sulation的动作。 看了一下wiki给的C example,有几个问题想请教各位 在例题里,作者把structure definition放在obj.c,且include obj.h,并且在obj.h里宣 告了 struct obj Q1: 第一次看到struct obj;这种用法,这种用法是告诉compiler我在别的file里有define struct obj这个data type吗? 如果是的话,那应该要 + extern吧? 为什麽不加extern也可以? Q2: 刚刚翻了textbook(C how to program),作者说: struct obj{ int id; }; 这个行为叫"define"一个structure且不reserve any space in memory(page 384)。 这个跟我心中认为的define有点出入,不reserve memory的话不是应该叫declare吗? 还是对於struct与对於variable来说,define与declare的定义不一样? Q3: 我原本习惯的作法是直接把 struct obj{ int id; }; 这个definition放在obj.h。并不像作者,把它放在.c档且在.h里面多declare一个 struct obj。 我想这就是作者所谓的hide implementation。也就是说,struct里面的member就是 implementation罗? 我认知的implementation是指"实作",也就是function里的snippet。 所以struct里面的member也算是implementation吗?还是在特定的context里才算数? 谢谢拨冗查看~ --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.216.85.243
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1530241960.A.A2B.html
1F:推 AstralBrain: Q1: extern是指定linkage用的 06/29 11:32
2F:→ AstralBrain: struct没有linkage所以不能(也不需要)加extern 06/29 11:32
不好意思,请问这句是什麽意思?
3F:→ AstralBrain: Q2:struct的define跟函数的比较像 有body就是define 06/29 11:33
4F:→ AstralBrain: Q3:我觉得看context, 各自表述 XD 06/29 11:34
5F:→ sarafciel: 因为他的struct没有打算让你看到 这就是他这样写的目的 06/29 12:39
6F:→ sarafciel: 留那行宣告只是因为他开给你的函式要用而已 06/29 12:41
我刚刚用gcc试了一下,就算没加struct obj;这行宣告,只宣告 void obj_setid(struct obj *, int); compiler还是给过。我认为就算没加struct obj; 对於obj_setid这个function来说,struct obj *本身就是一个declare了,并不需要在前 面多加struct obj;这行宣告
7F:→ sarafciel: defination就是要有明确的定义 变数是实际执行时的资料 06/29 12:48
8F:→ sarafciel: 所以它的"明确定义"必须要有存放变数的位置 06/29 12:49
9F:→ sarafciel: struct则是"切割记忆体与看待切割区块的方式" 06/29 12:51
10F:→ tinlans: C 的 type 只是编译期资讯,不会被编译到 object file 06/29 13:37
11F:→ tinlans: 所以当然不会产生任何在执行期占据记忆体的东西。 06/29 13:38
12F:→ tinlans: 然後语言本身要求识别字 (变数、函式名等) 使用前要宣告 06/29 13:39
13F:→ tinlans: ,也就是要告诉编译器那个识别字是什麽东西。 06/29 13:40
14F:→ tinlans: struct obj; 就是告诉编译器 obj 是一个 strcut type, 06/29 13:40
15F:→ tinlans: 但是细节未知,在只有使用到 obj *,不需要存取 members 06/29 13:41
16F:→ tinlans: 或者知道配置一个 obj instance 要多大空间的状况下, 06/29 13:41
17F:→ tinlans: 编译器是不用知道整个 type definition 的。 06/29 13:42
18F:→ tinlans: 识别字要宣告的理由也只是方便 parser 做语法语意检查。 06/29 13:43
19F:推 Neisseria: 这很常见的手法,如果不想暴露 struct 细节就这样写 06/29 16:12
我发现就算没宣告struct obj;这行,程式也编译的过。 ideone: https://ideone.com/VbUs6R ※ 编辑: zzss2003 (60.251.49.183), 06/29/2018 17:52:41 ※ 编辑: zzss2003 (60.251.49.183), 06/29/2018 17:53:30
20F:→ yvb: 请用 http://rextester.com/l/c_online_compiler_gcc 06/29 18:53
21F:→ yvb: 勾选 Show compiler warnings 看看. 06/29 18:54
22F:推 Neisseria: 那是运气好,该写还是要写 06/29 20:38
23F:→ Neisseria: 可能没实际呼叫也有差,没详细研究... 06/29 20:42
24F:推 AstralBrain: 你是想问为什麽struct没有linkage吗 06/29 21:08
25F:→ AstralBrain: 就tinlans回的第一句话那样 06/29 21:09
26F:→ tinlans: C 规定 struct type 一定要用 struct 开头,所以你省略的 06/30 02:39
27F:→ tinlans: 话,编译器还是可以正确解析,不过劝你还是养成习惯。 06/30 02:39
28F:→ tinlans: 实务上因为这样写太冗长,大家会用 typedef 变成免写 06/30 02:46
29F:→ tinlans: struct,这种时候你就还是得先宣告。 06/30 02:46







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP