C プリプロセッサは不要な #ifdef ブロックを削除できますか?
特定のマクロが定義されている場合にのみコードをインクルードするには、#ifdef による条件付きコンパイルが不可欠ですまたは未定義。ただし、時間の経過とともに、マクロが古くなったり使用されなくなったりして、デッドコードが残される可能性があります。
この問題に対処するために、開発者は、ユーザー指定のマクロ定義 (-D) および未定義のマクロ定義 (-) を分析できるプリプロセッサのバリエーションを模索してきました。 U) その後、不要な #ifdef を削除します。
例:
次のコードを考えてみましょう:
#ifdef NAME1 #define ALBUQUERQUE "ambidextrous" #else #define PHANTASMAGORIA "ghostly" #endif
プリプロセッサが '-DNAME1' で実行された場合、出力されるはずです。 :
#define ALBUQUERQUE "ambidextrous"
「-UNAME1」を使用すると、 generate:
#define PHANTASMAGORIA "ghostly"
提案されたツール:
unifdef およびその後継の sunifdef として知られる提案されたツールは、この要件を満たします。ユーザー指定のマクロ定義および削除と組み合わせて入力コードを分析します。
例 1:
#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 */
-DUSE_VOID -UPLATFORM1 を使用した出力:
#undef VOID typedef void VOID; typedef void * VOIDPTR;
例2:
#ifndef DOUBLEPAD #if (defined NT) || (defined OLDUNIX) #define DOUBLEPAD 8 #else #define DOUBLEPAD 0 #endif /* NT */ #endif /* !DOUBLEPAD */
-UOLDUNIX による出力:
#ifndef DOUBLEPAD #if (defined NT) #define DOUBLEPAD 8 #else #define DOUBLEPAD 0 #endif /* NT */ #endif /* !DOUBLEPAD */
利点:
unifdef または sunifdef を使用すると、いくつかの利点があります。含む:
例が示すように、ツールは複雑な処理を行うことができます条件とネストされた #ifdef ブロックを効果的に実行します。これは、大規模で進化するコードベースを管理するための強力なツールです。
以上がプリプロセッサは C コード内の冗長な `#ifdef` ブロックを削除できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。