typedef用法的必要性


在看 cocos2d-x 的源码,发现很多地方有这样的定义(源码在 这里 ):


 typedef struct _AsyncStruct
{
    std::string            filename;
    CCObject    *target;
    SEL_CallFuncO        selector;
    int handler;
} AsyncStruct;

我的问题是:为什么不直接这样写:


 struct AsyncStruct
{
    std::string            filename;
    CCObject    *target;
    SEL_CallFuncO        selector;
    int handler;
}

cocos2d-x C++

saber93 10 years, 4 months ago

程序猿大多不想做 重复 的工作, 你比较下下面两段代码:


 struct AsyncStruct {
  int a;
  int b;
};

struct AsyncStruct i; // 定义一个变量
struct AsyncStruct j; // 定义另外一个变量


 typedef struct _AsyncStruct {
  int a;
  int b;
}AsyncStruct;

AsyncStruct i; // 定义一个变量 (这里不用再写一个**struct**)
AsyncStruct j; // 定义另外一个变量 (这里不用再写一个**struct**)

如果是后者写法: 其他人也不用纠结定义一个AsyncStruct变量时要不要加 struct ~

引导人民的哲学 answered 10 years, 4 months ago

C语言规定,变量定义要写 elaborated type ,也就是说,对于 struct S{...} 类型的变量定义要写成 struct S s; ,为了省掉这个 struct ,你就需要用 typedef struct S S1 来定义个名叫 S1 elaborated type ,然后你就可以直接用 S1 来定义变量了。
其实C标准中 S S1 可以重名,也就是说你可以写 typedef struct S S ,但有一些古老的编译器不支持你这么写,所以一般会换个名字比如 typedef struct _S S

以上所述只针对C语言,C++基本没这个问题(除了friend声明)。

PS. 对于像cocos2d-x这样只能用在新编译器上的C++库,还这么写只能说明作者其实根本没明白为什么。

可怕的猫熊 answered 10 years, 4 months ago

Your Answer