Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Pra-pemproses C Boleh Menghapuskan Kod Mati Berdasarkan Makro Ditakrifkan/Tidak Ditakrifkan?

Bagaimanakah Pra-pemproses C Boleh Menghapuskan Kod Mati Berdasarkan Makro Ditakrifkan/Tidak Ditakrifkan?

Patricia Arquette
Patricia Arquetteasal
2024-12-06 10:52:12856semak imbas

How Can a C Pre-processor Eliminate Dead Code Based on Defined/Undefined Macros?

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!

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