请见代码:
问下typedef和宏定义为什么会有这个区别?谢谢! |
-
#define是定义一个宏常量,编译前的预处理阶段,会把程序内所有的a,文本替换为int,不负责检查这种替换是不是对的。
typedef,是为本次编译活动(能看见这条定义的所有cpp),定义个新的数据类型b,以后可以直接使用b这个类型来定义新的变量。这是编译期的事件,因为是明确的类型定义,编译器将为其做一定的合理性检查。
如果写错了,编译器报出来的错误也不一样:
#define a int
typedef int b;
void Funccc(void)
{
char* p=NULL;
a aa=0;
aa=p;
b bb;
bb=p;
}
1>d:/00xgwork/test_asm/test_asm/test_asm.cpp(15) : error C2440: “=”: 无法从“char *”转换为“int”(a 的错误)
1> 没有使该转换得以执行的上下文
1>d:/00xgwork/test_asm/test_asm/test_asm.cpp(17) : error C2440: “=”: 无法从“char *”转换为“b”(b的错误)
1> 没有使该转换得以执行的上下文
-
宏只是预处理的时候替换掉.在编译的时候直接就是unsigned int i;
typedef这个我还没找到相关的资料
-
谢谢两位老师~
-
#define 可以随意使用,反正编译器只做替换,唯一的限制是定义的内容里面不允许再出现#define或者#pragma或者#ifdef
typedef是类型再定义,限制比较多:
1、一个类型不允许被拆分,一定是个完整的定义
2、不允许出现const修饰符
3、不能与其它类型一起组合成新类型
像你的例子,只能这样定义:
typedef unsigned int b;
b i;
因为unsigned int是一个独立的类型,不能被拆分
-
胡柏华(C/C++老师)typedef是可以用 const的
: #define 可以随意使用,反正编译器只做替换,唯一的限制是定义的内容里面不允许再出现#define或者#pragma或者#ifdef
typedef是类型再定义,限制比较多:
1、一个类型不
typedef const int Type;
Type x = 199;
这样就能编译过去
类型组合也成,但不知道如何定义变量
typedef int I;
void func( unsigned I)
{
}
这样也行,但就是写不上去参数。
-
unsigned I会被编译器识别为unsigned类型的变量I
-
胡柏华(C/C++老师)<img src='/image/teacher.gif' border='0'>: unsigned I会被编译器识别为unsigned类型的变量I
这个我是在《The C++ Programming Language》中看到的写法。
解释是f是一个没有名字的unsigned int为参数。
在附录中提到了这个情况。
也不清楚标准关于这点是怎么规定的
-
这是C语言中最恶心的地方,几乎所有编译器都不能百分百符合规范也就是这个原因,当存在二义性的时候,看编译器优先选择谁。有时连规范都没有考虑到。
习惯良好的程序员通常都不会故意设计出具有二义性的代码,因为结果极可能就是苦了自己,累了别人。