哪位兄弟和我说说~typedef和#define的区别?
看C++ PRIMER 3RD的时候 指向函数的指针那段,有关于用typedef简化指向函数指针表示的那段
我对那几个typedef 声明以后 指向函数的指针被改写后的形式有点不明白~~归根结底还是不明白宏和typedef的区别~~~
问题点数:20、回复次数:10Top
1 楼skfox(sky)回复于 2005-11-03 22:07:31 得分 0
1,#define 不是语句 不要在行末加分号,而typedef要
2,#define在预处理 时进行简单的替换,而typedef不是简单替换 ,而是采用如同定义变量的方法那样来声明一种类型
Top
2 楼OpenGLfalcon(游隼)回复于 2005-11-03 22:45:54 得分 0
给你举个例子:
1. typedef int MYINT
MYINT a//其实编译器解释为int a,就相当于自己定义了一个类型一样,注意只能是类型要么是自定义的,要么是内部的
2#define PI 3.1415926//那么当编译器遇到PI的时候就会用3.1415926来替换掉,关键是你编程的时候不用去记一些容易忘记的常量值,而且一旦你在语句#define中修改了PI的值,那么以后PI的值都会随之变化,很方便,且不会遗忘,不会出错Top
3 楼Goldrush(上天有好生之德)回复于 2005-11-03 22:51:50 得分 0
#define是在预编译的时候处理的,
typeded是在编译时处理的,这两者是不同的,实际上它并不是简单的字符替换
使用typedef有利于程序的通用与移植
举个例子你就明白了。
#define f(x) x*x
main( )
{
int a=6,b=2,c;
c=f(a) / f(b);
printf("%d \n",c);
}
它的输出结果为36而我们期盼的结果是9(6*6)/(2*2)
其根本原因就在于#define只是简单的字符串替换,但若这里你用typedef定义的话就不会出现这样的问题Top
4 楼K()回复于 2005-11-04 01:29:18 得分 0
代#号的都是预处理语句Top
5 楼newbiestar()回复于 2005-11-04 03:37:02 得分 0
一个是编译器处理的东西,而另外一个是预处理器处理的东西,存在的范围都不一样,没有什么可比性……Top
6 楼ilovezqj(William yin)回复于 2005-11-04 12:50:19 得分 0
将testCases 声明为一个拥有10 个元素的数组每个元素都是一个指向函数的函数指针
该函数没有参数返回类型为int
像数组testCases 这样的声明非常难读因为很难分析出函数类型与声明的哪部分相关
在这种情况下使用typedef 名字可以使声明更为易读例如
// typedefs 使声明更易读
typedef int (*PFV)(); // 定义函数类型指针的typedef
PFV testCases[10];
testCases 的这个声明与前面的等价
我就是不理解
typedef int (*PFV)(); // 定义函数类型指针的typedef
PFV testCases[10];
testCases 的这个声明与前面的等价
哪位兄台和我说说~~Top
7 楼ilovezqj(William yin)回复于 2005-11-04 15:55:44 得分 0
up~~~~~~~~~~~~`Top
8 楼moonfkypm(传说)回复于 2005-11-04 16:13:17 得分 0
我就是不理解
typedef int (*PFV)(); // 定义函数类型指针的typedef
PFV testCases[10];
testCases 的这个声明与前面的等价
你就看成一个类型不就的了!
何况它本来就是一个自定义的类型!
如下:
int (*testCases[0])()
Top
9 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-11-04 18:20:10 得分 0
只有一楼的第二条才说出了两者的本质区别。不要被两者类似的外部形式所迷惑了(实际上,也只有在最简单的情况下两者外部形式才有点相似,其它99%的情况连相似都算不上),两者实际上是完全不同的东西,一个是替换,另一个是声明。Top
10 楼ilovezqj(William yin)回复于 2005-11-05 11:19:25 得分 0
哦~~我明白了~~仔细琢磨了二楼的话以后我明白了~~呵呵~~谢谢Top




