C Pra-pemproses untuk Menghapuskan Blok Bersyarat
Dalam bidang pengaturcaraan C, keperluan sering timbul untuk menghapuskan kod mati berdasarkan yang ditetapkan atau makro yang tidak ditentukan. Walaupun prapemproses C standard menyediakan keupayaan kompilasi bersyarat terhad, keperluan lanjutan memerlukan alat khusus. Artikel ini meneroka pra-pemproses C yang mampu memenuhi keperluan sedemikian.
Pertimbangkan senario di mana pangkalan kod mengandungi blok bersyarat seperti:
#ifdef NAME1 #define ALBUQUERQUE "ambidextrous" #else #define PHANTASMAGORIA "ghostly" #endif
Pra-pemproses dengan fungsi yang diingini akan menerima argumen baris perintah untuk menentukan makro yang ditakrifkan atau tidak ditakrifkan, seperti '-DNAME1' atau '-UNAME1'. Menjalankan arahan dengan '-DNAME1' akan menghasilkan output berikut:
#define ALBUQUERQUE "ambidextrous"
Sebaliknya, melaksanakan arahan dengan '-UNAME1' akan menghasilkan:
#define PHANTASMAGORIA "ghostly"
Lebih kompleks senario dengan pelbagai keadaan dan blok bersarang juga boleh dikendalikan dengan tepat. Pertimbangkan contoh berikut:
#ifdef USE_VOID #ifdef PLATFORM1 #define VOID void #else #undef VOID typedef void VOID; #endif /* PLATFORM1 */ typedef void * VOIDPTR; #else typedef mint VOID; typedef char * VOIDPTR; #endif /* USE_VOID */
Menjalankan arahan dengan '-DUSE_VOID -UPLATFORM1' akan menghasilkan output berikut:
#undef VOID typedef void VOID; typedef void * VOIDPTR;
Akhir sekali, contoh yang melibatkan keadaan bersarang:
#ifndef DOUBLEPAD #if (defined NT) || (defined OLDUNIX) #define DOUBLEPAD 8 #else #define DOUBLEPAD 0 #endif /* NT */ #endif /* !DOUBLEPAD */
Meluluskan hujah '-UOLDUNIX' akan menghasilkan:
#ifndef DOUBLEPAD #if (defined NT) #define DOUBLEPAD 8 #else #define DOUBLEPAD 0 #endif /* NT */ #endif /* !DOUBLEPAD */
Penyelesaian Disyorkan
Berdasarkan cadangan yang disediakan dalam utas asal, sunifdef menonjol sebagai pra yang teguh dan berkesan -pemproses mampu menghapuskan kod mati berdasarkan makro yang ditakrifkan/tidak ditentukan. Ia telah digunakan secara meluas dengan kejayaan besar, menghapuskan beribu-ribu blok bersyarat yang tidak diperlukan.
Atas ialah kandungan terperinci Bagaimanakah Pra-pemproses C Boleh Menghapuskan Kod Mati Berdasarkan Makro Ditakrifkan/Tidak Ditakrifkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!