typedef的理解及复杂函数声明的理解
来源:互联网 发布:c语言 最短字符串 编辑:程序博客网 时间:2024/04/29 10:49
在讲typedef前先简单说下#define,也许是受了这个的影响,以至于记typedef的时候总是按#define的方式来记了,先举个#define的简单例子
#define MAX_NUM 4096
对于#define还是比较好理解,就是将MAX_NUM出现的地方替换成4096,也就是简单的字符串替换。
我开始的记法就是将替换的置左边,被替换的置右边。
现在举个typedef的简单例子
typedef char INT8;
typedef是将char类型取一个别名为INT8。
我开始的记法是类型别名在右边,原类型名在左边。(与#define反一下,我都怀疑是不是就我这么想的 = =)
但当我看到如下声明时,我就束手无策了。
typedef void (*handle)(int);
handle signal(int ,handle fun);
这种时候什么左右完全排不上用场了。
最后我换了种思考方式,就是联想到如何声明一种类型的方法,就容易理解了。(事实上在我写完这边博客后,翻阅《c专家编程》第67页有写到‘事实上,typedef的格式与变量声明完全一样,只是多了这个关键字,向你提醒它的实质。’这话时,我完全对自己无语了...)
比如 int num;它的类型是int。
那么 int (*p)(); 的类型是什么呢?
其获取方法其实跟int num;一样,就是将变量的名字和分号去掉,那么int (*p)();的类型就是 int (*)()
而typedef就是要用一个新的名字来替换原类型名,我们把上面的过程反过来想,将变量/函数名想成是我们新的类型名即可。
其实就是你先像往常声明变量或函数一样,而typedef只是将变量名换成你要设置的类型别名,比如你想用INT8这表示类型char,先像声明变量一样如下写到:
char INT8;
然后就是简单的在前面加个typedef即可。
typedef char INT8;
反过来看typedef声明好的类型,就是把typedef去掉,把它当成是变量或函数的声明,然后分析该变量或函数的类型即可。
这里说下分析的过程,
A、从左开始查看变量或函数名,然后按照优先级顺序依次读取
B、优先级从高到低依次是:
B. 1 声明中被括号括起来的那部分
B. 2 后缀操作符:
括号()表示这是一个函数,而方括号表示这是一个数组
B. 3 前缀操作符:星号*表示 "指向...的指针”。
C、如果const和volatile关键字的后面紧跟类型说明符(如int, long等),那么它作用于类型说明符。在其他情况下,const和(或)volatile关键字作用于它左边紧邻的指针星号。
比如singal函数
void (*signal(int sig, void(*func)(int)))(int);
1、先找到signal名,后面是个括号,先把括号里的东西作为一个整体,表示signal是个函数。
2、signal前面是个星号,表示函数返回一个指针。
3、 星号所在括号后面紧跟一个括号,表示指针指向带有一个int型参数并返回void的函数指针
4、signal函数参数则是一个int型及 一个指向带有一个int型参数并返回void的函数指针
这里找出共同部分就是指向带有一个int型参数并返回void的函数指针
将该共同部分定义成一个新类型, 则singal函数可声明如下:
typedef void (*handle)(int);
handle signal(int , handle);
最后说下#define宏定义,跟我一样搞不清顺序的.. 就从定义这个词入手,要定义的东西先写,然后描述。
参考资料:《C专家编程》
- typedef的理解及复杂函数声明的理解
- 理解复杂的C/C++声明 const, typedef , 函数指针
- 理解复杂的C/C++声明 const, typedef , 函数指针
- 理解复杂的C/C++声明 const, typedef , 函数指针
- 理解复杂的C/C++声明 const, typedef , 函数指针
- typedef (包含对复杂函数声明的理解)
- 理解复杂的C声明 const, typedef , 函数指针
- 理解复杂的C/C++声明 const, typedef , 函数指针(转贴)
- C++ 理解复杂的声明
- 复杂声明的理解1
- 理解复杂的声明2
- 如何理解复杂的声明
- typedef:C 中复杂的函数声明
- typedef C 中复杂的函数声明
- 指向const对象的const指针 typedef 理解复杂的const类型的声明
- 教你理解复杂的C-C++ 指针函数声明
- typedef 的复杂声明用法
- typedef 复杂的变量声明
- iOS objc_msgSend 报错解决方案
- doxygen的特定命令
- string 用法总结
- Calling Lua functions : using C++ language
- Android 圆形图片
- typedef的理解及复杂函数声明的理解
- SVM由浅入深的详细讲解(遇到最易懂的)
- 创建Material Design风格的Android应用--应用主题
- HDU 1827 Summer Holiday(强连通)
- C++ new
- 数据结构 线性表部分代码 C语言转写(待补充)
- 第二章线性表思维导图
- 【2-SAT】 HDU 4421 Bit Magic
- Spark集群模式&Spark程序提交