typedef int x[10] 和 #define x int[10]的区别
1、可以对宏类型进行扩展,但是对typedef不能。
#define APP_INT int[10]
unsigned APP_INT i; //没有问题
2、在连续几个变量的声明中,用typedef定义的类型能够保证声明中所有的变量均为同一种类型,而用#define定义的类型无法保证。
typedef char * CHAR_PTR;
CHAR_PTR buf_out, buf_in; //没有问题,buf_out和buf_in是同一种类型
typedef char * STRING; //用STRING表示char*类型
typedef void(*ptr_to_func) (int); //用ptr_to_func表示一个类型,该类型是指针类型,该指针指向一个参数为int,返回为void的函数。
C语言声明的例子,从C语言声明的优先级规则 ->C语言声明解析图 ->伪代码 ->代码。
每一步都逐渐深入和清晰
编程方案:
Struct token { char type;
Char string[MAXTOKENLEN];
}
//保存第一个标识之前的所有标记
Struct token stack[MAXTOKENS];
//保存刚读入的那个标记
Struct token this;
伪码:
Classify_string (字符串分类)
查看当前的标记
通过this.type返回一个值
Gettoken(取标记)
把下一个标记读入this.string
如果是字母数字组合,调用classify_string
否则,它必是一个单字符标记,this.type=该标记,用一个NUL结束this.string
Read_to_first_identifier (读至第一个标识)
调用gettoken,并把标记压入到堆栈中,直到遇见第一个标识符
打印标识符
继续调用gettoken
解析程序:
Deal_with_function_args 处理函数参数
当读取越过右括号 “)”后,打印“函数返回”
Deal_with_arrays 处理函数数组
当你读取[size]后,将其打印并继续向右读取。
Deal_with_any_pointers 处理任何指针
从堆栈读取*时,打印
Deal_with_declarator 处理声明器
If this.type is‘[‘ deal_with_arrays
If this.type is‘(‘ deal_with_function_args
Deal_with_any_pointers
With 堆栈里还有东西
If 他是一个左括号 ‘(‘
将其弹出堆栈,并调用gettoken; 应该获得右括号‘(’
Deal_with_declarator
Else
将其弹出堆栈并打印它