typedef为一种类型引入新的名字,而不是为变量分配空间,它并没有引入新的类型,而是为现有的类型取个新名字。在说到typedef时,有一个很好的例子是signal()函数声明,但是,一般而言只有极少数情况才会使用到这样的技巧,这里就不再赘述,我们应该知道更多关于typedef对于大多数程序员应该知道的事。
说到typedef就不能不说一下它的缺点。它同样具有与其他声明一样的混乱语法。可以把几个声明器塞到一个声明中去,例如:
typedef int *ptr,(*fun)(void),arr[5];
ptr是指向int的指针类型;
fun是指向返回值为int的参数为void的函数的指针类型;
arr是长度为5的int型数组类型。
上面这样的写法应该尽量避免使用。
甚至typedef的位置不是必须放在声明的开始部分,例如:
#include<stdio.h> int main(void) { int typedef a; a b=5; printf("%d\n",b); return 0; }
也不要把typedef嵌入到声明的中间部分,如下所示:
unsigned long typedef int volatile *kumquat;
这样的表达式会让代码变得不好阅读,要说明的是,上面的代码不是定义一个unsigned long int volatile *这样类型的别名。
我们使用typedef,是为了使代码更易于阅读,给已有类型取一个我们喜欢的别名,不要滥用或者乱用它。
再来看看typedef和define的区别
最基本的区别:
#define mychar char*
mychar a,b;
typedef char * yourchar;
yourchar c,d;
define是纯文本替换,如果用define定义的类型定义多个对象,那样只有第一个对象才是原本define的类型,在上面的例子中,b是char不是char*类型,但是c和d都是char *类型。
还有一个区别:
typedef是一种彻底的“封装”,在声明它之后不能再往里面增加别的东西,这和宏不同。
#define peach int unsigned peach i;//right typedef int banana; unsigned banana j;//err
知道这些之后,我们平时书写代码就应该遵循一些规范,把typedef放在声明的开始,并且一个类型用一个typedef修饰,不要在typedef类型前后加其他声明器。
C语言存在多种名字空间:
。标签名
。标签:这个名字空间用于所以的结构、枚举、联合。
。成员名:每个结构或联合都有自身的名字空间
。其他
在同一个名字空间里,任何名字必须具有唯一性,但在不同的名字空间里可以存在相同的名字。
由于在不同的名字空间使用同一个名字是合法的,所以这样的代码是可以通过编译的,但还是不建议这样书写。
struct foo{int foo;}foo;