搜索
bottom↓
回复: 28

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

[复制链接]

出0入0汤圆

发表于 2018-5-21 14:17:31 | 显示全部楼层 |阅读模式
最近在学习sqlite3,其中有一个sqlite3_stmt结构,找不到定义的地方。
只能找到 typedef struct sqlite3_stmt sqlite3_stmt; 这样的语句。
自己定义自己,实在看不懂它的作用,请教论坛大神指教。

出0入0汤圆

发表于 2018-5-21 14:20:07 | 显示全部楼层
作用就是使用这种类型的时候不需要再写struct

出0入0汤圆

 楼主| 发表于 2018-5-21 14:25:50 | 显示全部楼层
lcw_swust 发表于 2018-5-21 14:20
作用就是使用这种类型的时候不需要再写struct

谢谢
不过不能理解的事没找到真正定义这个结构的地方
这样定义了算什么呢?空结构指针?

出0入0汤圆

发表于 2018-5-21 14:40:38 | 显示全部楼层
zhugean 发表于 2018-5-21 14:25
谢谢
不过不能理解的事没找到真正定义这个结构的地方
这样定义了算什么呢?空结构指针? ...

不知道...

出0入93汤圆

发表于 2018-5-21 14:46:58 | 显示全部楼层
哪里自己定义自己了?
是把struct sqlite3_stmt重命名成sqlite3_stmt了,看到没有,少掉了一个struct。struct sqlite3_stmt和sqlite3_stmt不是一回事,这就是公孙龙的白马非马。就是因为这么麻烦,所以C++中就改成一回事了。

出0入0汤圆

 楼主| 发表于 2018-5-21 14:47:15 | 显示全部楼层

谢谢,字数补丁……

出0入0汤圆

发表于 2018-5-21 14:52:01 | 显示全部楼层
takashiki 发表于 2018-5-21 14:46
哪里自己定义自己了?
是把struct sqlite3_stmt重命名成sqlite3_stmt了,看到没有,少掉了一个struct。stru ...

我也觉得奇怪,随便试了下居然编译通过,但是结构体本身并未定义。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入93汤圆

发表于 2018-5-21 15:11:50 | 显示全部楼层
lcw_swust 发表于 2018-5-21 14:52
我也觉得奇怪,随便试了下居然编译通过,但是结构体本身并未定义。


哦,原来你们说的是这个啊。这个是C语言的不完整类型,只要你不实际用到它,它就不会报错。大致类似于这样:
extern int var;            // 声明变量,这个var变量在任何地方都没有定义过
只要你不实际操作这个类型(分配空间)是不会报错的。你说可以定义指针变量?大概也对应于这样,一样不会出错:
int sz = sizeof(var);

或者简单的说,你直接声明
struct A;
再编译,同样是不会报错的。只是类型struct A是不完整的类型,无法用来定义变量。typedef只是取个别名,没有其他含义。

出0入4汤圆

发表于 2018-5-21 15:27:37 | 显示全部楼层
lcw_swust 发表于 2018-5-21 14:52
我也觉得奇怪,随便试了下居然编译通过,但是结构体本身并未定义。

试试引用一下。

没有使用到的东西,有可能编译器根本就没有去管他

出0入0汤圆

发表于 2018-5-21 15:30:13 | 显示全部楼层
takashiki 发表于 2018-5-21 15:11
哦,原来你们说的是这个啊。这个是C语言的不完整类型,只要你不实际用到它,它就不会报错。大致类似于这 ...

这样啊,
看来,楼主需要把有疑问的代码注释掉试试看

出0入0汤圆

发表于 2018-5-21 15:38:41 | 显示全部楼层
tpyedef 啊 大哥们,不是定义,就是重起个名字而已,和define 一个效果。

出0入296汤圆

发表于 2018-5-21 19:29:26 来自手机 | 显示全部楼层
728196 发表于 2018-5-21 15:38
tpyedef 啊 大哥们,不是定义,就是重起个名字而已,和define 一个效果。

typedef和#define 不是一个效果……不相信你定一个函数指针类型看看

出0入0汤圆

发表于 2018-5-21 19:57:39 来自手机 | 显示全部楼层
c语言要带struct,c++就不用了

出0入0汤圆

发表于 2018-5-21 19:59:25 来自手机 | 显示全部楼层
在c语言里面为了定义结构体时省写一个struct

出0入0汤圆

发表于 2018-5-21 14:17:32 | 显示全部楼层
不透明指针  https://stackoverflow.com/questi ... r-defined-structure
  这里有楼主要的答案

出0入0汤圆

发表于 2018-5-21 23:58:53 来自手机 | 显示全部楼层
lcw_swust 发表于 2018-5-21 14:20
作用就是使用这种类型的时候不需要再写struct

西科大的?校友啊

出0入0汤圆

 楼主| 发表于 2018-5-22 08:42:41 | 显示全部楼层
takashiki 发表于 2018-5-21 14:46
哪里自己定义自己了?
是把struct sqlite3_stmt重命名成sqlite3_stmt了,看到没有,少掉了一个struct。stru ...

我的问题是找不到真正定义的地方,这样定义起什么作用.

出0入0汤圆

发表于 2018-5-22 09:03:34 | 显示全部楼层
可能是放在了.c文件里定义了而没有放在.h里面 .h文件只做了声明 告诉外部文件有这个结构体

如果要想使用就得调接口函数,不能直接操作

出0入8汤圆

发表于 2018-5-22 09:06:08 | 显示全部楼层
zhugean 发表于 2018-5-22 08:42
我的问题是找不到真正定义的地方,这样定义起什么作用.

1.“找不到真正的定义”——没看过源码,这个只能楼主自己找了,用SI试试

2.“这样定义起什么作用”——这不是定义,是声明!(这个声明不占用存储空间,能编译通过)  


很常规的操作,作用前面很多楼都有说过了。

出0入0汤圆

 楼主| 发表于 2018-5-22 09:16:08 | 显示全部楼层
tragedy 发表于 2018-5-21 14:17
不透明指针  https://stackoverflow.com/questions/3279683/never-defined-structure
  这里有楼主要的答案 ...

谢谢!还是你能理解我的问题。
看了关于透明指针的介绍,真是学无止尽啊

出0入8汤圆

发表于 2018-5-22 09:16:21 | 显示全部楼层
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 * 的话,编译器会帮我们做静态类型匹配检查,代码的可阅读性也好一点。

出0入8汤圆

发表于 2018-5-22 09:17:23 | 显示全部楼层
zhugean 发表于 2018-5-22 09:16
谢谢!还是你能理解我的问题。
看了关于透明指针的介绍,真是学无止尽啊 ...

你错了,问题的本质是不完整类型。
不透明指针,只是封装作用的一种解释。

出0入0汤圆

 楼主| 发表于 2018-5-22 09:21:29 | 显示全部楼层
security 发表于 2018-5-22 09:16
在 8 楼,takashiki 已经给出了答案。
这是写法叫做:不完整类型(incomplete type)。

谢谢,指教。
其实不完整类型也好透明指针也好,他们的作用是类似的。

出0入8汤圆

发表于 2018-5-22 09:26:51 | 显示全部楼层
zhugean 发表于 2018-5-22 09:21
谢谢,指教。
其实不完整类型也好透明指针也好,他们的作用是类似的。

本质是靠不完整类型来支撑实现,这个才能解释你的为什么。
不透明指针只是一种别名解释。

出0入0汤圆

发表于 2018-5-22 09:43:11 | 显示全部楼层
湛无双 发表于 2018-5-21 23:58
西科大的?校友啊

是啊,你好校友

出0入8汤圆

发表于 2018-5-22 09:51:48 | 显示全部楼层
本帖最后由 security 于 2018-5-22 09:54 编辑

可以去查阅 C99 的手册,搜索 incomplete type。
我之所以说这么多,是想提醒你一下,分数应该送给 takashiki,我没记错的话,他较早给出了答案,只是你没看明白。

出0入0汤圆

发表于 2019-4-18 17:59:41 | 显示全部楼层
本帖最后由 bbslhb 于 2019-4-18 18:04 编辑

借楼问一下这个奇怪的struct。内容出自TI的HDC2010的官方驱动HDC2010.h
在这个HDC2010.h里面先后出现了这两行:而且HDC2010_Config之前没有定义过。
typedef struct HDC2010_Config    *HDC2010_Handle;
typedef struct HDC2010_Config {
    void const    *hwAttrs;
    void          *object;
} HDC2010_Config;
后面的HDC2010.c文件里面是这么使用的:
extern HDC2010_Config HDC2010_config[];
bool HDC2010_readRegister(HDC2010_Handle handle, uint16_t *data, uint8_t registerAddress)

出0入0汤圆

发表于 2019-4-18 22:01:40 | 显示全部楼层
bbslhb 发表于 2019-4-18 17:59
借楼问一下这个奇怪的struct。内容出自TI的HDC2010的官方驱动HDC2010.h
在这个HDC2010.h里面先后出现了这两 ...

有完整代码吗?看不出关联呢。

出0入0汤圆

发表于 2019-4-28 14:42:46 | 显示全部楼层
crazydtone 发表于 2019-4-18 22:01
有完整代码吗?看不出关联呢。

多谢楼上热心回复。应该就是不透明指针。
后来放弃了TI官方的 驱动,自己写了。
不透明指针等有空再看看学学。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 23:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表