Rumah >masalah biasa >Apakah kegunaan typedef

Apakah kegunaan typedef

DDD
DDDasal
2023-06-07 10:38:105199semak imbas

Penggunaan Typedef termasuk: 1. Jenis data asas Typedef mengambil "alias". Semua jenis data dalam bahasa C boleh menggunakan typedef untuk mentakrifkan semula nama jenis; termasuk: nama struktur struktur { };, nama unit kesatuan { };, enumerasi enum {}; 3. Typedef mengambil "alias" untuk tatasusunan;

Apakah kegunaan typedef

Persekitaran pengendalian artikel ini: sistem Windows 10, versi C++ 20, komputer dell g3.

Dalam aplikasi praktikal, typedef terutamanya mempunyai empat kegunaan berikut:

1) Jenis data asas Typedef mengambil "alias"

Dalam erti kata lain, semua jenis data dalam bahasa C boleh menggunakan kata kunci typedef untuk mentakrifkan semula nama jenis

typedef unsigned int size;typedef unsigned int16 u16;typedef unsigned int8 u8;...
2) typedef mengambil "alias" untuk jenis data tersuai

Jenis data tersuai termasuk: nama struktur struktur{ };, nama unit kesatuan { };, enumerasi enum { }; kaedah untuk mentakrifkan semula nama data untuk struktur ialah:

struct students{
	char sex;
	char name[120];
	int ages;};

Selain itu, ia juga boleh ditakrifkan dengan typedef:

struct students{
	char sex;
	char name[120];
	int ages;}std;std.name[20]="wujunwu"

3) Typedef ialah Tatasusunan mengambil " alias"
struct students{
	char sex;
	char name[120];
	int ages;};typedef struct students std;std.name[20]="wujunwu"
4) typedef mengambil "alias" untuk penunjuk
penunjuk biasa
typedef char arr_name[20];arr_name ane; ane[20]="wujunwu"
bersamaan dengan :
int a=2;int* pointer;pointer =&a;

Jika jenis data a ialah char, iaitu, char a =2; sebenarnya, program di atas dilaksanakan Dua langkah:

Langkah 1: Berikan penuding "alias"

int a=2;typedef int* pointer;pointer p;p=&a;
Langkah 2: Paksa penukaran jenis
char a=2;typedef int* pointer;pointer p;p=&(pointer)a;
Langkah 3: Berikan nilai kepada penunjuk
typedef unsigned int bool;typedef bool(*pCopySDMMC2Mem)(int, unsigned int, unsigned short, unsigned int*, bool);typedef void (*pBL2Type)(void);pCopySDMMC2Mem p1=(pCopySDMMC2Mem)0xD0037F98;pBL2Type p2 = (pBL2Type)0x23E00000;
Ringkasan: Apabila menggunakan typedef, typedef tidak mencipta sebarang jenis baharu, ia hanya menyediakan "alias" untuk jenis sedia ada untuk digunakan dalam atur cara.


Perangkap dalam typedef

Seterusnya lihat contoh mudah penggunaan typedef, seperti yang ditunjukkan dalam kod berikut:

pCopySDMMC2Mem p1;pBL2Type p2;

Dalam kod di atas , adakah "const PCHAR" bersamaan dengan "const char*"?

Jawapannya ialah tidak. Typedef digunakan untuk mentakrifkan alias baharu bagi sesuatu jenis dan bukan penggantian rentetan yang mudah. Oleh itu, const dalam "const PCHAR" memberikan keseluruhan penuding itu sendiri kemalar, yang membentuk penuding malar "char* const (penunjuk malar yang menunjuk ke char)". Iaitu, ia sebenarnya bersamaan dengan "char* const", bukan "const char* (penunjuk kepada constant char)". Sudah tentu, ia juga mudah untuk menjadikan const PCHAR bersamaan dengan const char*, seperti yang ditunjukkan dalam kod berikut:
(pCopySDMMC2Mem)0xD0037F98;  //真正在写代码时不能这样写(pBL2Type)0x23E00000;
Malah, apabila anda mengisytiharkan typedef untuk penunjuk, ia harus berada dalam typedef akhir nama Tambah const untuk menjadikan penunjuk itu sendiri pemalar.

Perlu juga diambil perhatian bahawa walaupun typedef tidak benar-benar mempengaruhi ciri storan objek, ia masih merupakan kata kunci kelas storan dalam sintaks, sama seperti kata kunci seperti auto, extern, statik dan daftar . Oleh itu, kaedah pengisytiharan berikut tidak boleh dilaksanakan:

p1=(pCopySDMMC2Mem)0xD0037F98;p2 = (pBL2Type)0x23E00000;

Sebab mengapa ia tidak boleh dilaksanakan ialah kata kunci kelas storan berbilang tidak boleh diisytiharkan Memandangkan typedef telah pun menduduki kedudukan kata kunci kelas storan, oleh itu, dalam typedef Anda tidak lagi boleh menggunakan kata kunci kelas storan statik atau lain-lain dalam perisytiharan. Sudah tentu, pengkompil juga akan melaporkan ralat Sebagai contoh, mesej ralat dalam VC++2010 ialah "Tidak boleh menentukan berbilang kelas storan."

Perbezaan antara typedef dan #define:

(1) Nama simbol yang dicipta oleh typedef terhad kepada Jenis, tidak terhad kepada nilai
(2) typedef ditafsirkan oleh pengkompil, bukan prapemproses

Empat kegunaan typedef

Dalam aplikasi praktikal , typedef Terdapat terutamanya empat penggunaan:

1) Jenis data asas Typedef mengambil "alias"

Dengan kata lain, semua jenis data dalam bahasa C boleh menggunakan Typedef Kata Kunci untuk mentakrifkan semula nama jenis

typedef unsigned int size;typedef unsigned int16 u16;typedef unsigned int8 u8;...
2) typedef mengambil "alias" untuk jenis data tersuai

Jenis data tersuai termasuk: nama struktur struktur{ } , unit kesatuan name { };, enumeration enum { };

struct students{
	char sex;
	char name[120];
	int ages;};

Kaedah yang biasa digunakan untuk mentakrifkan semula nama data dalam struktur ialah:

struct students{
	char sex;
	char name[120];
	int ages;}std;std.name[20]="wujunwu"

Selain itu, typedef juga boleh digunakan untuk mentakrifkan:

struct students{
	char sex;
	char name[120];
	int ages;};typedef struct students std;std.name[20]="wujunwu"
3) typedef mengambil "alias" untuk tatasusunan
typedef char arr_name[20];arr_name ane; ane[20]="wujunwu"
4) typedef mengambil "alias" untuk penunjuk
Penunjuk biasa
int a=2;int* pointer;pointer =&a;

bersamaan dengan:

int a=2;typedef int* pointer;pointer p;p=&a;

Jika jenis data a ialah char, iaitu, char a =2 maka,

char a=2;typedef int* pointer;pointer p;p=&(pointer)a;
typedef unsigned int bool;typedef bool(*pCopySDMMC2Mem)(int, unsigned int, unsigned short, unsigned int*, bool);typedef void (*pBL2Type)(void);pCopySDMMC2Mem p1=(pCopySDMMC2Mem)0xD0037F98;pBL2Type p2 = (pBL2Type)0x23E00000;
Langkah 3: Berikan nilai kepada penuding
pCopySDMMC2Mem p1;pBL2Type p2;
Ringkasan: Apabila menggunakan typedef, typedef tidak mencipta sebarang jenis baharu, ia hanya menyediakan "alias" untuk jenis sedia ada supaya ia boleh digunakan dalam digunakan dalam program.


Perangkap dalam typedef

Seterusnya lihat contoh mudah penggunaan typedef, seperti yang ditunjukkan dalam kod berikut:

(pCopySDMMC2Mem)0xD0037F98;  //真正在写代码时不能这样写(pBL2Type)0x23E00000;

Dalam kod di atas , adakah "const PCHAR" bersamaan dengan "const char*"?

Jawapannya ialah tidak. Typedef digunakan untuk mentakrifkan alias baharu bagi sesuatu jenis dan bukan penggantian rentetan yang mudah. Oleh itu, const dalam "const PCHAR" memberikan keseluruhan penuding itu sendiri kemalar, yang membentuk penuding malar "char* const (penunjuk malar yang menunjuk ke char)". Iaitu, ia sebenarnya bersamaan dengan "char* const", bukan "const char* (penunjuk kepada constant char)". Sudah tentu, ia juga mudah untuk menjadikan const PCHAR bersamaan dengan const char*, seperti yang ditunjukkan dalam kod berikut:
p1=(pCopySDMMC2Mem)0xD0037F98;p2 = (pBL2Type)0x23E00000;
Malah, apabila anda mengisytiharkan typedef untuk penunjuk, ia harus berada dalam typedef akhir nama Tambah const untuk menjadikan penunjuk itu sendiri pemalar.

Perlu juga diambil perhatian bahawa walaupun typedef tidak benar-benar mempengaruhi ciri storan objek, ia masih merupakan kata kunci kelas storan dalam sintaks, sama seperti kata kunci seperti auto, extern, statik dan daftar . Oleh itu, kaedah pengisytiharan berikut tidak boleh dilaksanakan:

typedef char* PCHAR;int strcmp(const PCHAR,const PCHAR);

Sebab mengapa ia tidak boleh dilaksanakan ialah kata kunci kelas storan berbilang tidak boleh diisytiharkan Memandangkan typedef telah pun menduduki kedudukan kata kunci kelas storan, oleh itu, dalam typedef Anda tidak lagi boleh menggunakan kata kunci kelas storan statik atau lain-lain dalam perisytiharan. Sudah tentu, pengkompil juga akan melaporkan ralat Sebagai contoh, mesej ralat dalam VC++2010 ialah "Tidak boleh menentukan berbilang kelas storan."

Atas ialah kandungan terperinci Apakah kegunaan typedef. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Apakah maksud sqlserver?Artikel seterusnya:Apakah maksud sqlserver?