使用c ++ typedef/using类型别名

Som*_*one 14 c++ typedef c++11

我正在阅读C++入门书,完全不理解一行:

 using int_array = int[4]; 
 typedef int int_array[4]; // This line
 for (int_array *p = ia; p != ia + 3; ++p) {
      for (int *q = *p; q != *p + 4; ++q)
          cout << *q << ' '; cout << endl;
 }
Run Code Online (Sandbox Code Playgroud)

好的typedef是一样的using.这是否意味着int[4][4]现在int以及如何理解这一点?什么类型int_arrayfor循环?

谢谢

use*_*301 11

TL; DR

两者都做了完全相同的事情:定义int_array为4的数组的别名ints

理解语法

using 有一个很好的A = B符号通常更容易理解.

using alias = type;
Run Code Online (Sandbox Code Playgroud)

typedef的符号并不是很落后.简单来说typedef

typedef type alias;
Run Code Online (Sandbox Code Playgroud)

但更复杂的typedefs往往会蔓延.我怀疑语法是根据人们如何定义一个变量来建模的,但我找不到我打包旧K&R C编程书的副本的地方,目前看不出来.

int int_array[4];
Run Code Online (Sandbox Code Playgroud)

将定义int_array为4 int秒的数组.拍打typedef前面

typedef int int_array[4];
Run Code Online (Sandbox Code Playgroud)

创建int_array一个类型别名而不是变量.

另一个例子,

int * intp;
Run Code Online (Sandbox Code Playgroud)

定义intp为指向的指针int.

typedef int * intp;
Run Code Online (Sandbox Code Playgroud)

定义intp为指向的类型指针的别名int.

由于typedefed别名的名称可能隐藏在定义的中间某处,因此使用更复杂的数据类型会变得很丑陋.一个typedefed函数指针,例如:

typedef void (*funcp)(param_t param1, param_t param2, ...);
Run Code Online (Sandbox Code Playgroud)

与使用

using funcp = void (*)(param_t param1, param_t param2, ...);
Run Code Online (Sandbox Code Playgroud)

制作2D阵列

如果你想要2D阵列,你可以

using int_array2D = int[4][4];
Run Code Online (Sandbox Code Playgroud)

或者你可以定义一个int_array数组

using int_array2D = int_array[4];
Run Code Online (Sandbox Code Playgroud)

当然,这意味着你可以

using int_array3D = int_array2D[4];
Run Code Online (Sandbox Code Playgroud)

并继续前进,直到奶牛回家或你已经挤满了医生大脑融化的那么多维度.


pla*_*ts1 6

这条线什么都不做,因为它是多余的

线条

using int_array = int[4];
Run Code Online (Sandbox Code Playgroud)

typedef int int_array[4];
Run Code Online (Sandbox Code Playgroud)

做同样的事。请参阅使用typedef 的参考。您可以忽略其中一个,行为是相同的。有两个不同的声明并不是错误,因为它们并不冲突(它们做完全相同的事情)。

第一种方法(使用using关键字)是在 C++11 中引入的,在我看来更容易阅读,所以我更喜欢它而不是 typedef 版本。