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

25

我正在阅读C++ Primer这本书,但有一行完全不理解:

 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;
 }

好的,typedefusing是一样的,这是否意味着int[4][4]现在是int了?如何理解这个问题?而在for循环中,int_array是什么类型?

谢谢。


7
支持“阅读C++ Primer书籍”的点赞。 - plats1
2
@plats1:在投票时请关注问题本身,而不是提问者正在阅读的书籍。 - Lightness Races in Orbit
1
@LightnessRacesinOrbit:在我看来,这个评论并不是对哪本书的评估,而是对那些阅读任何一本书而不是把SO当作教程的人的奖励。 - Ben Voigt
1
@BenVoigt:没错,阅读一本书的“奖励”并不是投票系统的目的!投票是为了产生代表帖子质量的得分。但我相信你已经知道这一点了。 - Lightness Races in Orbit
5
这个问题可能属于“这个问题表现出研究努力”的赞同理由之一。我不会因为这个原因而给一个问题点赞,但如果有人选择这样做,我也不会反对。 - Ben Voigt
显示剩余2条评论
3个回答

24

简介

两者做的事情是完全相同的:将int_array定义为4个int数组的别名。

理解语法

using有一个漂亮的A = B表示法,通常更容易理解。

using alias = type;
< p > typedef 的符号表示法不是很直观。对于一个简单的 typedef

typedef type alias;

但更复杂的typedef倾向于扩散开来。我怀疑这种语法是模仿如何定义变量的方式建模的,但我找不到我旧的K&R C编程书的副本,暂时无法查询。

int int_array[4];

使用 typedef 定义一个包含 4 个 int 的数组,命名为 int_array

typedef int int_array[4];

int_array 定义为类型别名而非变量。

另一个例子,

int * intp;

intp定义为指向int的指针。

typedef int * intp;

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

对于更复杂的数据类型,这可能会变得很麻烦,因为typedef的别名名称可能会被埋在定义的中间某个地方。例如,一个经过typedef处理的函数指针:

typedef void (*funcp)(param_t param1, param_t param2, ...);

使用 vs 使用

using funcp = void (*)(param_t param1, param_t param2, ...);

创建二维数组

如果你想要一个二维数组,可以:

using int_array2D = int[4][4];

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

using int_array2D = int_array[4];

当然,这意味着您可以

using int_array3D = int_array2D[4];

一直保持下去,直到牛回家或者你增加了太多维度,以至于The Doctor的大脑都溶化了。


这确实解释了typedef语法 - 这使得我更容易记住语法,而不是说“我只是要使用using”。 - WillC

6

这一行是多余的,没有实际作用

以下是正文

using int_array = int[4];

并且

typedef int int_array[4];

做同样的事情。参见使用typedef的参考文献。您可以留下其中一个,行为是相同的。具有两个不同声明并不冲突(它们执行完全相同的操作),因此这不是错误。
使用using关键字的第一种方法是在C++11中引入的,并且在我看来更容易阅读,因此我更喜欢它而不是typedef版本。

1

两个类型别名是相同的:


类型别名,别名模板(自C++11起)
类型别名是指代先前定义的类型的名称(类似于typedef):

using identifier attr(optional) = type-id ; 

所以,您可以使用以下内容:
typedef int int_array[4];

或者你可以直接使用以下代码(与上述代码相同):
using int_array = int[4];

当您需要使用4*sizeof(int)步骤来处理内存时,例如如果系统int大小为4字节,则内存步长为4*4=16字节。即使在这种情况下您可以使用int_array *p;,但++p会将p向前移动一个内存步长,例如16字节。 参见:

1- 使用 using int_array = int[4]; 的工作示例:

#include <iostream>
using std::cout; using std::endl;

int main()
{
    int ia[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };

    // a range for to manage the iteration
    // use type alias
    using int_array = int[4];
    for (int_array& p : ia)
        for (int q : p)
            cout << q << " ";
    cout << endl;

    // ordinary for loop using subscripts
    for (size_t i = 0; i != 3; ++i)
        for (size_t j = 0; j != 4; ++j)
            cout << ia[i][j] << " ";
    cout << endl;

    // using pointers.
    // use type alias
    for (int_array* p = ia; p != ia + 3; ++p)
        for (int *q = *p; q != *p + 4; ++q)
            cout << *q << " ";
    cout << endl;

    return 0;
}

输出 1:

0 1 2 3 4 5 6 7 8 9 10 11
0 1 2 3 4 5 6 7 8 9 10 11
0 1 2 3 4 5 6 7 8 9 10 11

使用typedef int int_array[4];的工作示例:

#include <iostream>
using std::cout; using std::endl;

int main()
{
    int ia[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };

    // a range for to manage the iteration
    // use type alias
    typedef int int_array[4];
    for (int_array& p : ia)
        for (int q : p)
            cout << q << " ";
    cout << endl;

    // ordinary for loop using subscripts
    for (size_t i = 0; i != 3; ++i)
        for (size_t j = 0; j != 4; ++j)
            cout << ia[i][j] << " ";
    cout << endl;

    // using pointers.
    // use type alias
    for (int_array* p = ia; p != ia + 3; ++p)
        for (int *q = *p; q != *p + 4; ++q)
            cout << *q << " ";
    cout << endl;

    return 0;
}

输出2(相同):
0 1 2 3 4 5 6 7 8 9 10 11
0 1 2 3 4 5 6 7 8 9 10 11
0 1 2 3 4 5 6 7 8 9 10 11

参考:https://github.com/Mooophy/Cpp-Primer/blob/master/ch03/ex3_44.cpp
注意:编译/链接时使用-std=c++11


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接