免费注册 查看新帖 |

Chinaunix

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

"typedef struct sqlite3_stmt sqlite3_stmt;"不解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-01 13:15 |只看该作者 |倒序浏览
"typedef struct sqlite3_stmt sqlite3_stmt;"和"struct y;"两句不理解

在看SQLIte代码时候有很多 sqlite3_stmt 类型的指针,但只有 “typedef struct sqlite3_stmt sqlite3_stmt;” 这么一句类型的定义,没有 struct sqlite3_stmt 的定义,在头文件说sqlite3_stmt是一个指向实例的指针,极其疑惑。

  1. #include <stdio.h>
  2. typedef struct sqlite3_stmt sqlite3_stmt;
  3. int main(){
  4.    sqlite3_stmt *p;
  5.    return 0;
  6. }
复制代码

用上面的代码模拟了一下,竟然能够通过编译(gcc v3.4.2)。然后就sizeof(sqlite3_stmt)测试,编译报错
error: invalid application of `sizeof' to incomplete type

如果定义一个sqlite3_stmt 的变量 var,测试报错
error: storage size of 'var' isn't known

前去查看规范 C99RationaleV5.10,竟然又碰到类似语句 ”struct y;(6.7.2.3节 tags)“。按照上面的方法又重测了一遍,出现了两个与上面完全相同的错误。

在SQLite 中既然大量使用了第一种用法,应该是有些特殊的用途,谁能给解释一下,非常感谢!

论坛徽章:
0
2 [报告]
发表于 2007-07-01 13:23 |只看该作者
一定得有定义,没有定义用不了,这个也许是第三方库里面的定义你没有找到罢了。

论坛徽章:
0
3 [报告]
发表于 2007-07-01 13:38 |只看该作者
google 不透明类型
不应该对不透明类型的大小作任何假设,也不应该去获得他的大小。

论坛徽章:
0
4 [报告]
发表于 2007-07-01 13:45 |只看该作者
SQLite这个程序全部是有源码的,我仔细核实过确实没有库文件及相应的头文件。再说程序中的大部分用法都是像下面这样进行了类型的转化,

  1. int sqlite3_bind_parameter_index(sqlite3_stmt *pStmt, const char *zName){
  2.   Vdbe *p = (Vdbe*)pStmt;
  3.   ... ... ...
复制代码

并没见到用sqlite3_stmt类型的指针去直接访问成员变量。在上面的测试中既然可以定义sqlite3_stmt类型的指针,那么SQLite中就能够这样不定义结构体而直接定义指针 pStmt, 应该没什么问题。

论坛徽章:
0
5 [报告]
发表于 2007-07-01 22:22 |只看该作者
sqlite3_stmt是不透名类型,见到了类似的例子,谢谢!

论坛徽章:
0
6 [报告]
发表于 2007-07-02 08:35 |只看该作者
<<linux kernel development>>这本书有简单的介绍。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP