web-dev-qa-db-ja.com

C ++ typedefの使用/ type aliasの使用

私はC++の入門書を読んでいますが、1行完全に理解していません。

 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はどのタイプですか?

ありがとう

13
Somethone

TL; DR

両方ともまったく同じことをしています:int_arrayを4の配列のエイリアスとして定義ints

構文を理解する

usingには、一般に理解しやすいニースA = B表記があります。

using alias = type;

typedefの表記法はまったく逆ではありません。単純なtypedefの場合

typedef type alias;

しかし、より複雑なtypedefsはスプロールする傾向があります。シンタックスは変数の定義方法をモデルにしたものと思われますが、古いK&R Cプログラミング本のコピーをどこに詰め込んでいるかはわかりませんし、現時点では調べられません。

int int_array[4];

int_arrayを4つのintsの配列として定義します。前面のtypedefを叩く

typedef int int_array[4];

int_arrayを変数ではなく型エイリアスにします。

もう一つの例、

int * intp;

intpintへのポインターとして定義します。

typedef int * intp;

intpへの型ポインターへのエイリアスとしてintを定義します。

typedefedエイリアスの名前が定義の途中に埋もれる可能性があるため、これはより複雑なデータ型では見苦しくなります。たとえば、typedefed関数ポインタ:

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

対使用

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 の脳が溶けるまで続けます。

10
user4581301

この行は冗長なので何もしません

台詞

using int_array = int[4];

そして

typedef int int_array[4];

同じことをします。 sing および typedef のリファレンスを参照してください。どちらか一方を省略できますが、動作は同じです。 2つの異なる宣言があるのはエラーではありません。それらは競合しないためです(まったく同じことを行います)。

最初の方法(usingキーワードを使用)はC++ 11で導入され、私の意見では読みやすいので、typedefバージョンよりもそれを好みます。

3
plats1

両方のタイプエイリアスは同じです。


タイプエイリアス、エイリアステンプレート(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;を使用しても、++ppを1メモリステップ進めます。 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

2- 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]);

これがお役に立てば幸いです。

1
A.R