使用 C 巨集自訂參數
巨集是 C 程式設計的基本面,允許程式碼自訂和靈活性。一個常見的要求是能夠在巨集中定義可選參數。
可選參數
考慮以下範例,其中我們有一個列印字串的巨集:
#define PRINT_STRING(message) PrintString(message, 0, 0)
此巨集接受一個強制參數,要列印的訊息。為了使其更通用,我們可以引入字串大小和字體樣式的可選參數:
#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)
用巨集重載
為了實作技巧來實現技巧,我們使用一個巨載
#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 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 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, )我們現在可以使用具有選用參數的重載PRINT_STRING 巨集:. ..) PRINT_STRING_MACRO_CHOOSER(__VA_ARGS__)(__VA_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, )例如,我們可以不帶參數呼叫巨集來列印預設字串:PRINT_STRING("Hello, World!");
#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, )或指定字串大小:PRINT_STRING("Hello, World!", 18);
#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, )或字串大小和字體樣式:PRINT_STRING("Hello, World!", 18, 粗體);
這種方法簡化了參數處理巨集呼叫者,增強程式碼的可重複使用性和多功能性。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3