C++: 为数据类型定义别名的方式
标签: C++ 定义别名 #define typedef
by 小威威
在C++中,为数据类型定义别名有两种方式:第一种就是用宏定义(#define),第二种方法就是用typedef。虽然这两种方法都能为数据类型定义别名,但是我还是比较推荐使用typedef,尤其是在定义多个变量的时候。
现在我们来看一段简单的代码,你就能很快的明白typedef优于宏定义的原因。
// 用宏定义定义别名
# include <iostream>
# define Pointer int*
// typedef int* Pointer;
int main(void) {
Pointer a, b;
a = 1;
b = 1;
return 0;
}
编译器显示的错误信息如下:
typedef.cpp: In function ‘int main()’:
typedef.cpp:6:7: error: invalid conversion from ‘int’ to ‘int*’ [-fpermissive]
a = 1;
^
根据编译器提示的信息,我们发现在该程序中,a是指针,不能正常赋值,而b是int类型,可以正常赋值。说明用宏定义的替换相当于下面的语句:
int *a, b;
即是定义a为指向int类型的指针,而b为int类型的变量。
// 用typedef定义别名
# include <iostream>
typedef int* Pointer;
int main(void) {
Pointer a, b;
a = 1;
b = 1;
return 0;
}
编译器显示的错误信息:
typedef.cpp: In function ‘int main()’:
typedef.cpp:6:7: error: invalid conversion from ‘int’ to ‘Pointer {aka int*}’ [-fpermissive]
a = 1;
^
typedef.cpp:7:7: error: invalid conversion from ‘int’ to ‘Pointer {aka int*}’ [-fpermissive]
b = 1;
^
根据编译器提示的信息,我们发现在该程序中,a、b都为指针,都不能正常赋值。说明编译器将代码转化为:
int *a, *b;
经过对比我们发现,宏定义这种编译前的替换有一定的局限性,它只是简单的进行替换,当变量数量较多时,就会出现类似于上面例子的情况。而typedef很聪明,不会产生这样的错误。
因此,我推荐用typedef为数据类型定义别名。
以上内容皆为本人观点,欢迎大家提出批评和指导,我们一起探讨!
版权声明:本文为linwh8原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。