请教typedef struct A A;用法的含义

2019-12-11 18:31发布

最近在学习sqlite3,其中有一个sqlite3_stmt结构,找不到定义的地方。
只能找到 typedef struct sqlite3_stmt sqlite3_stmt; 这样的语句。
自己定义自己,实在看不懂它的作用,请教论坛大神指教。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
28条回答
zhugean
1楼-- · 2019-12-13 20:43
tragedy 发表于 2018-5-21 14:17
不透明指针  https://stackoverflow.com/questions/3279683/never-defined-structure
  这里有楼主要的答案 ...

谢谢!还是你能理解我的问题。
看了关于透明指针的介绍,真是学无止尽啊
security
2楼-- · 2019-12-13 22:02
zhugean 发表于 2018-5-22 08:42
我的问题是找不到真正定义的地方,这样定义起什么作用.

在 8 楼,takashiki 已经给出了答案。
这是写法叫做:不完整类型(incomplete type)。

你可以去搜索一下调用 struct sqlite3_stmt 或者 sqlite3_stmt 的地方,肯定都是以指针形式出现的。
也就说调用形式都是 struct sqlite3_stmt * 或者 sqlite3_stmt *。

编译器不需要知道 struct sqlite3_stmt 的定义,就可以用来定义一个指针,因为指针的 size 是确定的,对于 32bit 的平台,指针总是 32bit 的。

至于为什么要出现这么一个结构体定义,本质原因是为了封装、隐藏细节。
真正的结构体,会在内部定义,对外呈现的 API 接口,统一是 struct sqlite3_stmt * 或者 sqlite3_stmt * 的抽象类型。
换个角度来看,你可以视为是 void * 类型。这样应该好理解一点,只不过用 struct sqlite3_stmt * 或者 sqlite3_stmt * 的话,编译器会帮我们做静态类型匹配检查,代码的可阅读性也好一点。
security
3楼-- · 2019-12-13 23:41
zhugean 发表于 2018-5-22 09:16
谢谢!还是你能理解我的问题。
看了关于透明指针的介绍,真是学无止尽啊 ...

你错了,问题的本质是不完整类型。
不透明指针,只是封装作用的一种解释。
zhugean
4楼-- · 2019-12-14 01:08
 精彩回答 2  元偷偷看……
security
5楼-- · 2019-12-14 07:01
zhugean 发表于 2018-5-22 09:21
谢谢,指教。
其实不完整类型也好透明指针也好,他们的作用是类似的。

本质是靠不完整类型来支撑实现,这个才能解释你的为什么。
不透明指针只是一种别名解释。
lcw_swust
6楼-- · 2019-12-14 11:17
湛无双 发表于 2018-5-21 23:58
西科大的?校友啊

是啊,你好校友

一周热门 更多>