Chinaunix

标题: typedef这两种写法是一样的吗 [打印本页]

作者: wheniwasyoung    时间: 2011-01-11 23:28
标题: typedef这两种写法是一样的吗
typedef struct {
        size_t *sorted;

        size_t used;
        size_t size;

        size_t unique_ndx;

} array;

===========================
typedef struct  array{
        size_t *sorted;

        size_t used;
        size_t size;

        size_t unique_ndx;

} array;
---------------------------------------------------------------------
如果上面两种写法是一样的,那么我怎么感觉第一种写法有点怪怪的
作者: folklore    时间: 2011-01-12 00:03
一有不一样
第一种是“无名”方式
第二种是正常方式

比如可以:
struct {
int a;
} abc;
struct {
int a;
} *p;

p=&abc;

也是可以的
作者: wheniwasyoung    时间: 2011-01-12 00:09
那么第一种的写法有何作用
作者: folklore    时间: 2011-01-12 00:26
回复 3# wheniwasyoung


    作用是相同的。请注意,我的例子中,事实上是两种“不同”的Struct
从结果来看是一样的,但第二种写法比较“原始”,所有的C编译器都可以用这种方式
第二种方式是一种扩展,可以看看C++的无名联合,无名结构。和命名结构、联合体在结果上一样的,只不过可以少取一个名字而已
作者: drangon    时间: 2011-01-12 08:33
第一种写法相当于  

typedef struct __no_name_0000001 { ..... } array;

主要差别在于虽然两者都可以使用 array  v1; 的方式定义变量,但第二种方式还可以使用 struct array v2; 的方式定义变量,而第一种方式不行。

有些人觉得混合使用struct array 和 array 这两种类型不好看,所以用第一种写法,只允许使用array类型
作者: wheniwasyoung    时间: 2011-01-12 09:28
明白了,多谢上面两位兄台
作者: wxfjx    时间: 2011-01-12 09:31
没有什么不一样,在Windows下,第一种会默认给添加一个名称……使用效果是一样的
作者: wb112200    时间: 2011-01-12 10:48
一样的 不过第一种方式比较常见...
作者: wensdrtr1    时间: 2011-01-12 12:52
一有不一样
作者: gtkmm    时间: 2011-01-12 12:57
在标准C里两种写法没区别,第二种写点 浪费了一个名字。。

如果在C++里,两种写法都是脑残
作者: quxiaoyong    时间: 2011-01-12 13:27
貌似第一种是匿名的吧。。。
作者: linyunxian    时间: 2011-01-12 17:01
区别在于这两种的意义,也就是编写者想表达的隐义,而不仅是使用上的区别。

使用上的区别 见 5 楼
作者: ilex    时间: 2011-01-12 20:22
用的时候是有区别的,

举个例子:两个结构体如下关系编译不过吧(VC,C语言)

tpyedef  struct  t_a_xx
{
       T_B  *pt_b;
       /* struct  t_b_xx *b 这样就能编译过 */

}T_A;

tpyedef  struct  t_b_xx
{
       T_A  *pt_a;   

}T_B;
作者: robin10    时间: 2011-01-12 21:15
用的时候是有区别的,

举个例子:两个结构体如下关系编译不过吧(VC,C语言)

tpyedef  struct  t_a_ ...
ilex 发表于 2011-01-12 20:22



    haha,以前见过这种嵌套的考题。。。

如果我的理解没错的话。。其实是不一样的。。。
好像5L的XD已经说了。。
作者: snowboy9859    时间: 2011-01-15 12:04
本帖最后由 snowboy9859 于 2011-01-15 21:26 编辑

第一种写法就相当于练葵花宝典,一次就没了,不能再定义其他的类似于array的变量,而第二种可以重复利用;
建议这样定义:
typedef struct  array{
        size_t *sorted;

        size_t used;
        size_t size;

        size_t unique_ndx;

};

struct array a,b,c;
作者: bluewaterray    时间: 2011-01-15 17:04
还是加上名字比较好,毕竟可以
typedef struct something {
    struct something *next;
} something_t;
作者: KBTiller    时间: 2011-01-15 17:09
回复 15# snowboy9859


    编译通不过吧
作者: snowboy9859    时间: 2011-01-15 19:37
回复 17# KBTiller


    你觉得不能这样引用?
作者: KBTiller    时间: 2011-01-15 20:08
回复 18# snowboy9859


    我只是觉得15楼的“}”后面还应该有个“;”。
    当然我没到编译器上试过。如果说错了请原谅。
作者: KBTiller    时间: 2011-01-15 20:12
本帖最后由 KBTiller 于 2011-01-18 09:40 编辑
还是加上名字比较好,毕竟可以
typedef struct something {
    struct something *next;
} something_t ...
bluewaterray 发表于 2011-01-15 17:04



    能这样当然很好,但有很多时候为“something”取名是非常费劲的,尤其是把它和“something_t”区分开就更费劲
    所以我宁愿
    typedef struct {
        struct something *next;
    } something_t
    我觉得这样更实惠些,至少不用煞费苦心地取两个名字了
作者: snowboy9859    时间: 2011-01-15 21:26
回复 19# KBTiller


    你是对的,我的失误
作者: pengsi548    时间: 2011-01-17 10:27
我怎么感觉
typedef stuct _student
{
int a ;
char s[10];

}Student,*Pstudent;
作者: yan8790511    时间: 2011-01-17 19:02
应该是一样的
作者: rain_fish    时间: 2011-01-17 19:51
一样的
作者: bluewaterray    时间: 2011-01-17 22:14
能这样当然很好,但有很多时候为“something”取名是非常费劲,尤其是把它和“something_t”区分 ...
KBTiller 发表于 2011-01-15 20:12
  1. typedef struct aaa_s {
  2.        ...
  3. } aaa_t;

  4. typedef enum bbb_e {
  5.    ...
  6. } bbb_t;
复制代码
如此,所以并不费劲
作者: KBTiller    时间: 2011-01-18 09:39
回复 25# bluewaterray


    加后缀,很好的办法!如果能成为一种规范就太好了
作者: alsace_008    时间: 2011-01-21 16:27
学习了
作者: bjruntest    时间: 2011-01-21 17:18
一样




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2