在 C 中,巨集可以成為程式碼重用和抽象的強大工具。然而,它們也缺乏傳統物件導向程式語言所具有的一些彈性。其中一個功能是能夠在巨集中定義可選參數。
要在巨集中定義可選參數,您可以結合使用參數清單和預處理器技巧。常見的方法是在巨集中使用巨集來提供重載功能。例如:
#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)
這裡定義了三個巨集(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__) 中提取第四個參數,在本例中代表
要使用選用參數機制,您可以呼叫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中文網其他相關文章!