C では、マクロはコードの再利用と抽象化のための強力なツールになります。ただし、従来のオブジェクト指向プログラミング言語に見られる柔軟性も一部欠けています。そのような機能の 1 つは、マクロでオプションのパラメータを定義する機能です。
マクロでオプションのパラメータを定義するには、引数リストとプリプロセッサ トリックを組み合わせて使用できます。一般的なアプローチの 1 つは、マクロ内でマクロを使用してオーバーロード機能を提供することです。例:
#define PRINT_STRING_1_ARGS(message) PrintString(message, 0, 0) #define PRINT_STRING_2_ARGS(message, size) PrintString(message, size, 0) #define PRINT_STRING_3_ARGS(message, size, style) PrintString(message, size, style)
ここでは、3 つのマクロ (PRINT_STRING_1_ARGS、PRINT_STRING_2_ARGS、および PRINT_STRING_3_ARGS) が定義されており、それぞれに異なる数のパラメーターが付いています。渡されたパラメーターの数に基づいて正しいマクロを選択するために、プリプロセッサ トリックが使用されます。
#define GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4 #define PRINT_STRING_MACRO_CHOOSER(...) \ GET_4TH_ARG(__VA_ARGS__, PRINT_STRING_3_ARGS, \ PRINT_STRING_2_ARGS, PRINT_STRING_1_ARGS, ) #define PRINT_STRING(...) PRINT_STRING_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__)
GET_4TH_ARG マクロは、可変引数リスト (__VA_ARGS__) から 4 番目の引数を抽出します。この場合、これは、
オプションのパラメータメカニズムを使用するには、次のように PRINT_STRING マクロを呼び出すことができます:
PRINT_STRING("Hello, World!"); // Call with 1 argument PRINT_STRING("Hello, World!", 18); // Call with 2 arguments PRINT_STRING("Hello, World!", 18, bold); // Call with 3 arguments
このアプローチには、オブジェクト指向言語の真のオーバーロードと比較していくつかの制限があることに注意することが重要です:
以上がC マクロでオプションのパラメーターを実装するにはどうすればよいですか?また、このアプローチの制限は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。