一,typedef与#define的区别
1,作用的时间不同
(1)typedef
typedef是编译期的行为,因此typedef有类型检查的功能。
typedef unsigned int Age;
void func(){
Age value = "abc"; //error C2440: 'initializing' : cannot convert from 'const char [4]' to 'UINT'
cout << value << endl;
}
(2)#define
#define是预编译期的行为,发生在预处理阶段,也就是编译之前,它只进行简单文本替换,而不进行任何检查。
#define f(x) x * x
int main() {
int a = 1, b = 2;
int c = f(a + b);
cout<<c;
return 0;
}
输出结果为5,而我们期望的输出值是9。
2,作用域不同
(1)typedef
typedef有自己的作用域。
class Object{
public:
typedef void (*HealthFunc)(int x);
};
int main() {
HealthFunc func;
return 0;
}
上面的代码在编译时就会出错。
(2)define
没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。
void func1(){
#define HW "HelloWorld";
}
int main() {
string str = HW;
cout << str << endl;
return 0;
}
3,作用于指针时的不同
typedef int * Point1;
#define Point2 int *
int x = 10;
const Point1 p1 = &x; //p1不可修改,但是可以修改p1指向的对象
const Point2 p2 = &x; //p2可以修改,但是不能修改p2指向的对象