今日头条
c语言中typedef的用法是为了为已知类型提供新类型,在ansi c标准中typedef被归为存储类关键字,也即是说在进行typedef 声明的时候,在本来出现在存储类的位置的标识符不能再出现其他存储类关键字,而一个对象的声明只能有一个存储类关键字,比如
typedef static int INT;就是非法的声明方式
这样做的目的是为了在进行类型声明时候的统一让编译器解释非常方便。如此看来,在进行typedef声明的时候可以把typedef当做如static auto extern register这样的存储类关键字对待。但是区别在于,typedef并不会为声明的对象预留存储空间,它的作用仅仅在于给已知类型换个名字,并没有产生新的类型,在进行typedef声明后的类型可以加上存储类说明符,也可以对类型进行重新声明,比如
typedef long Block;extern Block(1);extern int Block(2);1和2是不一样的,且第二个是重新声明了Block
一般声明的格式是:存储类说明符 类型说明符 类型限定符 声明符(表) 或者存储类说明符 类型限定符 类型说明符 声明符(表),存储类说明符如上,类型限定符包括const volatile 类型说明符就是一般的原子类型和派生复合类型 struct enum union
复杂声明 信号头文件中有一个复杂声明void (*signal(int _sig, void (*_func)(int)))(int);
这里面有三个运算符,一个是*,一个是(),一个是逗号,按照运算符的优先级来说()的优先级高于*,而主标识符为singal,那么来解读这个声明
从主标识符开始,signal的右边是个括号,所以singal是个函数,左边是个*说明返回值是个指针,一个函数有两个要素,一个是形参,一个是返回值,那么函数的形参是什么?看右边括号,这个比较复杂先不解读,看他的返回值,返回值是一个指针,那么指针指向什么看最右边的括号,说明返回值指向的是一个函数,函数的形参是int型,返回值是个空类型void,那么连起来即使signal是个返回值指向形参类型为Int返回值为空的函数,这里说了signal的返回值,
那么再说说signal的形参,看它的右边括号,形参有两个,一个是int,一个是void (*_func)(int),按照优先级来看,因为_func的右边没有完整的()所以解读左边的,_func是个指针,那么指针指向哪?看右边,指针指向一个函数,函数的形参是个Int类型,再看左边返回值是个void类型,所以这是一个指向形参为int,返回值为空的函数的指针,
那么连起来,signal是个函数,函数的形参一个是整型,一个是函数指针,返回值是个指针,指向一个函数,指向的函数的形参是int类型,返回值为空。
全部0条评论
快来发表一下你的评论吧 !