typedef可以成为你的朋友
Posted 悄然拔尖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了typedef可以成为你的朋友相关的知识,希望对你有一定的参考价值。
typedef static char int8;这个声明正确吗?
A:err
所以上面那个声明是错误的。
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;
这样的表达式会让代码变得不好阅读!!!
我们使用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;
typedef struct baz{int baz;} baz;
struct baz var1;
baz var2;
这些都是合法的。只有结构标签能够在以后的声明中使用(注意了!)。可以用typedef定义一个结构类型,这样可以省略struc的书写,也可以直接用struct 标签 变量的方式,就算使用了typedef也一样。
在使用typedef的时候,应该尽量避免混淆,做到思路清晰,代码可读性高。
再看一例:
#include<stdio.h>
typedef char * test;
int main(void)
{
const char * str=0;
str++;// 正确底层const,常量指针,该指针指向的对象是常量,但指针自身可以改变
const test string=0;
string++;//错误,typedef出的是类型别名 char *,此时加const修饰为指针常量,即该指针是常量。
return 0;
}
前面说了,不要在使用了typedef的标识符前后再加修饰(上面例子在typedef声明的别名test前又加了一个const修饰),那样有可能和你想的不同。知道可能的坑,并善于利用typedef带给我们的便利,typedef可以成为你的朋友。
以上是关于typedef可以成为你的朋友的主要内容,如果未能解决你的问题,请参考以下文章