C++: 为数据类型定义别名的方式

  • Post author:
  • Post category:其他


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 版权协议,转载请附上原文出处链接和本声明。