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

时间:2017-07-08 19:34:01

标签: c++ c++11 typedef

我正在阅读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;
 }

typedefusing相同。这是int[4][4]现在是int还是如何理解? int_array循环中for的类型是什么?

谢谢

3 个答案:

答案 0 :(得分:7)

TL; DR

两者都做了完全相同的事情:将int_array定义为4 ints

数组的别名

理解语法

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

using alias = type;

typedef的符号并不是很落后。对于简单的typedef

typedef type alias;

但更复杂的typedef往往会蔓延。我怀疑语法是根据人们如何定义一个变量建模的,但我无法找到我打包旧K&amp; R C编程书的副本,目前无法查看。

int int_array[4];

int_array定义为4个int的数组。在正面拍打typedef

typedef int int_array[4];

使int_array成为类型别名而非变量。

另一个例子,

int * intp;

intp定义为指向int的指针。

typedef int * intp;

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

由于typedef ed别名的名称可能隐藏在定义的中间位置,因此对于更复杂的数据类型会变得很难看。一个typedef ed函数指针,例如:

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

vs使用

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

制作2D数组

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

using int_array2D = int[4][4];

或者你可以定义一个int_array

数组
using int_array2D = int_array[4];

当然这意味着你可以

using int_array3D = int_array2D[4];

继续前进,直到奶牛回家,或者你已经挤满了The Doctor大脑融化的那么多维度。

答案 1 :(得分:1)

此行不执行任何操作,因为它是多余的

using int_array = int[4];

typedef int int_array[4];

做同样的事情。请参阅usingtypedef的参考。你可以把一个或另一个留下来,行为是一样的。拥有两个不同的声明并不是错误,因为它们没有冲突(它们完全相同)。

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

答案 2 :(得分:1)

两种类型的别名都是相同的:

Type alias, alias template (since 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进行编译/链接。

3-仅用于演示(摘录):
嵌入式系统中的一些实际应用:

extern const char kpd2ascii[6][6] PROGMEM;
typedef const char cint8a6_t[6];
cint8a6_t *p;
p = kpd2ascii;
kpdBuffer = pgm_read_byte(&p[row][col - 1]);

我希望这会有所帮助。