免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: okyzx
打印 上一主题 下一主题

关于typedef struct [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-07-31 11:59 |只看该作者
原帖由 okyzx 于 2007-7-31 11:36 发表


我有看,但是还是不理解,你能讲的深入一点么?有如下疑问
1 他具体是怎么来实现封装的呢?
2 能不能用一个void*来代替呢?
3 你提到说,“结构的实际大小可变”,但在代码中他并没有定义这个结构体,怎 ...


gcc编译通不过你的代码,我修改后
  1. int main()
  2. {
  3.         struct _Socket_Handle{};
  4.         //printf("sizeof(_Socket_Handle)=%d ", sizeof(_Socket_Handle));
  5.         printf("sizeof(struct _Socket_Handle)=%d ", sizeof(struct _Socket_Handle));

  6.         struct _Socket_Handle2{char i;};
  7.         //printf("sizeof(_Socket_Handle2)=%d ", sizeof(_Socket_Handle2));
  8.         printf("sizeof(struct _Socket_Handle2)=%d ", sizeof(struct _Socket_Handle2));
  9.         return 0;
  10. }
复制代码


结果如我预期那样,第一个为0,后一个为1

ps 那个结构题定义应该存在(至少应被声明)否则编译应该通不过

论坛徽章:
0
12 [报告]
发表于 2007-07-31 12:20 |只看该作者
原帖由 okyzx 于 2007-7-31 11:36 发表


我有看,但是还是不理解,你能讲的深入一点么?有如下疑问
1 他具体是怎么来实现封装的呢?
2 能不能用一个void*来代替呢?
3 你提到说,“结构的实际大小可变”,但在代码中他并没有定义这个结构体,怎 ...


如果你到现在还没有找到那个struct的具体定义,他就到达了封装的目的。
可以用void *代替,但是不够漂亮。
你没招到他的定义,你可以自己定义。你找到定义,你也可以在结构体后面再加上一些字段,就实现了继承。

论坛徽章:
0
13 [报告]
发表于 2007-07-31 12:39 |只看该作者

有助于类型检查。

假设
typedef void *HSOCKET;
typedef void * HFILE;
HSOCKET tmp;

某个地方
tmp = fopen(...);
或者
fclose(tmp);

不会有错误提示的。

[ 本帖最后由 spibit 于 2007-7-31 12:42 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2007-07-31 12:52 |只看该作者
原帖由 spibit 于 2007-7-31 12:39 发表
假设
typedef void *HSOCKET;
typedef void * HFILE;
HSOCKET tmp;

某个地方
tmp = fopen(...);
或者
fclose(tmp);

不会有错误提示的。


也要看编译器对类型检查时是否用结构等价,不过C好像只有在遇到结构体等才用结构代价,很久没看编译了,忘得差不多了

论坛徽章:
0
15 [报告]
发表于 2007-07-31 17:05 |只看该作者
原帖由 okyzx 于 2007-7-31 11:13 发表
在看别人的代码中发现如下写法

typedef  struct  _Socket_Handle*    HSOCKET;

在代码中,直接使用HSOCKET 如:HSOCKET hSock;
但是奇怪的是并没有发现_Socket_Handle具体的定义,编译也能正常通过,这是 ...


大哥这是类型预定义

typedef  struct  _Socket_Handle*    HSOCKET;

....
...

最后会有一个地方是

struct  _Socket_Handle
{

   ...........
};

论坛徽章:
0
16 [报告]
发表于 2007-07-31 18:13 |只看该作者
原帖由 Jiangge 于 2007-7-31 11:59 发表

ps 那个结构题定义应该存在(至少应被声明)否则编译应该通不过


$ cat code.c
#include<stdio.h>

int main() {
  typedef struct none* TP;
  TP inst;

  printf("size=%d\n", sizeof(inst));

  return 0;
}

$ gcc -o out code.c

$ ./out
size=4

论坛徽章:
0
17 [报告]
发表于 2007-07-31 18:30 |只看该作者
有意思的问题, 标记下
记得以前看c++的时候,有说到过
除非用到结构体内部的数据,否则编译器并不关心这个结构体到底是什么样的
按照这个逻辑
typedef struct None* INS 的声明似乎就是合法的, 属于特例, 源自编译器的偷懒行为?
等待大虾的进一步解释~

论坛徽章:
0
18 [报告]
发表于 2007-07-31 18:38 |只看该作者
原帖由 fnems 于 2007-7-31 18:13 发表


$ cat code.c
#include

int main() {
  typedef struct none* TP;
  TP inst;

  printf("size=%d\n", sizeof(inst));

  return 0;
}

$ gcc -o out code.c

$ ./out
size=4


我说的也不严谨,你写的这个能通过编译,是因为:
你定义了TP这个类型,所以你sizeof当然可以了,因为他是一个指针阿(在编译时能确定大小)

ps 不过不知道是不是在其他编译器上也能通过,按理说,C语言规定的应该先声明,难道typedef也能同时声明这个?请指教

论坛徽章:
0
19 [报告]
发表于 2007-07-31 18:42 |只看该作者
#include <stdio.h>

typedef struct None *INS;
struct ST1
{
};
struct ST2
{
    char i;
};
    int
main(void)
{

    INS ins;
    struct ST1 st1;
    struct ST2 st2;

    fprintf(stdout, "%d\n", (int)sizeof(ins));
    fprintf(stdout, "%d\n", (int)sizeof(struct ST1));
    fprintf(stdout, "%d\n", (int)sizeof(struct ST2));

    return 0;
}
cygwin + gcc下编译,执行结果如下
4
0
1

论坛徽章:
0
20 [报告]
发表于 2007-07-31 18:47 |只看该作者
原帖由 halve 于 2007-7-31 18:42 发表
#include

typedef struct None *INS;
struct ST1
{
};
struct ST2
{
    char i;
};
    int
main(void)
{

    INS ins;
    struct ST1 st1;
    struct ST2 st2;

    fprintf(stdout, ...


你这个是什么意思阿?我的意思是你把你先前那个程序用VC编译一下,看有什么结果
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP