web-dev-qa-db-ja.com

このtypedefステートメントはどういう意味ですか?

C++のリファレンスページでは、typedefの例がいくつか提供されており、それらの意味を理解しようとしています。

// simple typedef
typedef unsigned long mylong;


// more complicated typedef
typedef int int_t, *intp_t, (&fp)(int, mylong), arr_t[10];

だから私が理解している単純なtypedef(最初の宣言)。

しかし、彼らは2番目のもの(以下で繰り返されます)で何を宣言していますか?

typedef int int_t, *intp_t, (&fp)(int, ulong), arr_t[10];

特に(&fp)(int, mylong)はどういう意味ですか?

76
rsgmon

複数の変数を一度に宣言できるのと同じように、複数のtypedefを一度に宣言します。これらはすべてintに基づくタイプですが、一部は複合タイプに変更されています。

それを別々の宣言に分割しましょう:

typedef int int_t;              // simple int
typedef int *intp_t;            // pointer to int
typedef int (&fp)(int, ulong);  // reference to function returning int
typedef int arr_t[10];          // array of 10 ints
96
Mike Seymour
typedef int int_t, *intp_t, (&fp)(int, mylong), arr_t[10];

と同等です:

typedef int int_t;
typedef int *intp_t;
typedef int (&fp)(int, mylong);
typedef int arr_t[10];

C++ 11標準には実際に同様の例があります。

C++ 11 7.1.3 typedef指定子

typedef- nameは、class宣言(9.1)またはenum宣言のように新しい型を導入しません。例:after

typedef int MILES , * KLICKSP ;

構造

MILES distance ;
extern KLICKSP metricp ;

すべて正しい宣言です。距離のタイプはintであり、metricpのタイプは「intへのポインター」です。 -終了例

41
Yu Hao

cdeclコマンドがある場合は、それを使用してこれらの宣言をわかりやすく説明できます。

cdecl> explain int (&fp)(int, char)
declare fp as reference to function (int, char) returning int
cdecl> explain int (*fp)(int, char)
declare fp as pointer to function (int, char) returning int

cdeclがない場合は、通常の方法でインストールできるはずです(たとえば、DebianタイプのシステムではSudo apt-get install cdeclを使用)。

32
Amarghosh

_(&fp)(int, mylong)_の部分は、関数への参照を表します。この質問をしているという理由から、プログラマーがtypedefの関数を使用することはお勧めしません。コードを見ている他の人を混乱させます。

私は彼らが次のようなものでtypedefを使用していると推測しています:

_typedef unsigned long mylong; //for completeness
typedef int (&fp)(int, mylong);
int example(int param1, mylong param2);

int main() {
     fp fp_function = example;
     int x = fp_function(0, 1);
     return 0;
}

int example(int param1, mylong param2) {
     // does stuff here and returns reference
     int x = param1;
     return x;
}
_

ブライアンのコメントに従って編集:

int(&name)(...)関数参照呼び出されますname(関数はintを返します)

int &name(...)nameと呼ばれる関数ですintへの参照を返す

int参照を返す関数への参照は、次のようになります。typedef int &(&fp)(int, mylong)(これはプログラムでコンパイルされますが、動作はテストされていません)。

0
ub3rst4r