直接上例子:
typedef int * pint; #define PINT int * int i1 = 1, i2 = 2; const pint p1 = &i1; //p不可更改,p指向的内容可以更改,相当于 int * const p; const PINT p2 = &i2; //p可以更改,p指向的内容不能更改,相当于 const int *p;或 int const *p; pint s1, s2; //s1和s2都是int型指针 PINT s3, s4; //相当于int * s3,s4;只有一个是指针。 void TestPointer() { cout << "p1:" << p1 << " *p1:" << *p1 << endl; //p1 = &i2; //error C3892: 'p1' : you cannot assign to a variable that is const *p1 = 5; cout << "p1:" << p1 << " *p1:" << *p1 << endl; cout << "p2:" << p2 << " *p2:" << *p2 << endl; //*p2 = 10; //error C3892: 'p2' : you cannot assign to a variable that is const p2 = &i1; cout << "p2:" << p2 << " *p2:" << *p2 << endl; }结果:
p1:00EFD094 *p1:1 p1:00EFD094 *p1:5 p2:00EFD098 *p2:2 p2:00EFD094 *p2:5比如,定义一个叫 FALSE 的浮点类型,在目标平台一上,让它表示最高精度的类型为: typedef long double FALSE; 在不支持 long double 的平台二上,改为: typedef double FALSE; 在连 double 都不支持的平台三上,改为: typedef float FALSE;
也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。
标准库就广泛使用了这个技巧,比如 size_t。参考文献1 参考文献2 参考文献3