C专家编程——分析C语言的声明

C语言声明的语法有时会带来严重的问题——Dennis
    声明的形式和使用的形式相似,这是C语言声明的一种缺陷。例如声明指针数组int *p[3];使用数组第四个元素*p[3]
    在此,C语言的声明无法以自然方式(从左到右)阅读,在ANSI C引入volatile和const关键字之后情况更糟了。
    
    指针是只读的:const int *p;int const p;
    对象是只读的:int *const p;
    指针和对象都是只读的:const int *const p;int const * const p;
    


C语言之难点——声明


C语言声明的优先级规则:P64,解析C语言的声明P65
A:找到标识符

B:B.1声明中被括号括起来的部分;

      B.2后缀操作符()表示函数,[]表示数组;

      B.3前缀操作符,*表示指向...的指针。

C:const与volatile关键字后面紧跟的说明符(int,long)则,它作用于类型说明符。
   其他情况const和volatile关键字作用于它左边紧邻的指针星号


分析三个令人感到恐怖的C语言声明
char *const *(*next)();
next是一个指针,它指向一个不接收参数的函数,函数返回一个指针,该指针指向一个指向char类型的常量指针


char *(* c[10])(int **p);
c是一个数组,数组10个元素[0..9],每个元素都是形式相同的指向函数的指针,该函数的参数为指向int的二级指针,返回值为指向字符的指针


void (*signal(int signo, void (*func)(int)))(int);
signal是一个函数,函数参数为int和一个函数指针(这个指针指向的函数接收一个int参数,返回值是void),signal函数返回值是一个函数指针,这个函数指针恰是其参数本身
该函数可以使用typedef简化为:
typedef void (*Sigfunc)(int);//Sigfunc是一个函数指针
Sigfunc signal(int signo, Sigfunc func);


typedef没有增加类型,只是为现有类型取了一个别名。注意typedef的害处
1、不要在一个typedef中放入几个声明器。例如,typedef int *ptr, (*fun)(), arr[5];正确,但不好读,易理解错误。
2、千万不要把typedef嵌入到声明的中间部分。


typedef int x与#define x int
1、可以用其它类型说明符对宏类型扩展,typedef类型不可以。unsigned x i;//宏正确,typedef错误。typedef具有彻底的封装性。
2、连续几个变量的声明中,typedef定义类型能保证声明中所有的变量均为同一类型,#define不能保证。简言之,作用的范围不同。
#define int_ptr int *
int_ptr a, b;//宏扩展后是int * a,b;b是int类型
typedef int *int_ptr;
int_ptr a, b;//a和b的类型都是int指针


为了方便而对结构使用typedef,这样唯一的好处是不必书写struct关键字,然而这个关键字可以提供有用信息。
所以,不要为了方便而对结构使用typedef,这是错误的思维方式。


typedef应该用在 数组、结构、指针以及函数的组合类型;用在可移植类型;为强制类型转换提供一个简单名字。


编程挑战——分析C语言的声明,编制这个解析器相当于实现编译器中主要的子系统之一。
这个编程过程需要稍微延后一些,目前我还没有完全理解,也没有编好程序。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值