Pertanyaan Apa arti pernyataan typedef ini?


Di halaman referensi C ++ mereka memberikan beberapa contoh typedef dan saya mencoba memahami apa yang mereka maksud.

// simple typedef
typedef unsigned long mylong;


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

Jadi typedef sederhana (deklarasi pertama) saya mengerti.

Tapi apa yang mereka nyatakan dengan yang kedua (diulang di bawah)?

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

Khususnya apa (&fp)(int, mylong) berarti?


76
2018-02-27 07:23


asal


Jawaban:


Ini mendeklarasikan beberapa typedefs sekaligus, sama seperti Anda dapat mendeklarasikan beberapa variabel sekaligus. Mereka semua berdasarkan jenis int, tetapi beberapa dimodifikasi menjadi tipe majemuk.

Mari kita pisahkan menjadi deklarasi terpisah:

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

97
2018-02-27 07:30



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

setara dengan:

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

Sebenarnya ada contoh serupa dalam standar C ++ 11:

C ++ 11 7.1.3 Itu typedef penentu

SEBUAH typedef-name tidak memperkenalkan tipe baru dengan cara a class deklarasi (9.1) atau enum deklarasi tidak .Contoh: setelah

typedef int MILES , * KLICKSP ;

konstruksi

MILES distance ;
extern KLICKSP metricp ;

semua deklarasi yang benar; jenis jarak int adalah dari metricp adalah "pointer ke int. "—Akhir contoh


41
2018-02-27 07:26



Jika Anda punya cdecl perintah, Anda dapat menggunakannya untuk mengungkap deklarasi ini.

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

Jika Anda tidak punya cdecl, Anda harus dapat menginstalnya dengan cara biasa (mis. pada sistem jenis Debian, menggunakan sudo apt-get install cdecl).


32
2018-02-27 07:32



Itu (&fp)(int, mylong) bagian mewakili referensi ke suatu fungsi. Tidak dianjurkan bahwa programmer menggunakan fungsi dalam typedef untuk alasan Anda mengajukan pertanyaan ini. Ini membingungkan orang lain yang melihat kode.

Saya menduga mereka menggunakan typedef dalam sesuatu seperti ini:

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

Diedit sesuai dengan komentar Brian:

int(&name)(...) adalah referensi fungsi bernama name (fungsi mengembalikan int)

int &name(...) adalah fungsi yang disebut name  mengembalikan referensi ke int

Referensi ke fungsi yang mengembalikan sebuah int referensi akan terlihat seperti ini: typedef int &(&fp)(int, mylong) (ini mengkompilasi dalam sebuah program, tetapi perilaku tersebut belum teruji).


0
2018-02-27 07:37



typedef mendefinisikan tipe baru untuk digunakan dalam kode Anda, seperti singkatan.

typedef typename _MyBase::value_type value_type;
value_type v;
//use v

nama typen di sini adalah membiarkan compiler mengetahui bahwa value_type adalah tipe dan bukan objek di dalam _MyBase.

:: adalah lingkup dari tipe. Ini seperti "di" jadi value_type "ada di" _MyBase. atau bisa juga dianggap mengandung.

Kemungkinan duplikat: C ++ - arti dari pernyataan yang menggabungkan typedef dan nama-nama


-7
2018-02-27 07:34