」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何在 C++ 巨集中實作可選參數以進行程式碼自訂?

如何在 C++ 巨集中實作可選參數以進行程式碼自訂?

發佈於2024-12-21
瀏覽:662

How can you implement optional parameters in C   macros for code customization?

使用 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, 粗體);

How can you implement optional parameters in C   macros for code customization? 
這種方法簡化了參數處理巨集呼叫者,增強程式碼的可重複使用性和多功能性。

最新教學 更多>
  • 如何正確處理帶有空白邊界的 CSV 檔案?
    如何正確處理帶有空白邊界的 CSV 檔案?
    使用Scanner() 讀取CSV 問題使用Scanner() 讀取CSV 檔案時,通常會遇到文字包含空格的問題被移動到下一行。發生這種情況是因為 Scanner 遵循空格邊界。 Scanner() 用法中的 CSV 處理不正確提供的程式碼片段使用 Scanner() 讀取和處理 CSV 檔案。但是...
    程式設計 發佈於2024-12-21
  • 如何解決Hibernate中的LazyInitializationException?
    如何解決Hibernate中的LazyInitializationException?
    LazyInitializationException:無法從方法呼叫存取代理遇到「LazyInitializationException:無法初始化代理程式- 無會話」錯誤通常表示Hibernate 應用程式中的延遲載入問題。當您嘗試存取活動 Hibernate 會話範圍之外的延遲初始化的實體(例...
    程式設計 發佈於2024-12-21
  • 為什麼 Go 在套件中定義字串函數而不是方法?
    為什麼 Go 在套件中定義字串函數而不是方法?
    Go中基本類型的方法程式語言Go包含多種字串函數,例如ToUpper()和Split() 。與其他語言可能將這些函數定義為字串類型的方法不同,Go 將它們定義為 strings 套件的一部分。為什麼會這樣呢? 簡單性和靈活性根據Go 的創建者的說法,將方法保留在字符串等基本類型之外的主要原因之一是維...
    程式設計 發佈於2024-12-21
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-12-21
  • 將 Azure SQL 資料庫升級到 v12 後,為什麼會出現 TLS 握手錯誤?
    將 Azure SQL 資料庫升級到 v12 後,為什麼會出現 TLS 握手錯誤?
    v12 升級後Azure SQL 資料庫TLS 握手錯誤Azure SQL 資料庫實例升級到v12 後,您可能會遇到TLS 握手錯誤。當伺服器提供的憑證與用戶端連線字串中指定的主機名稱不符時,就會發生此錯誤。 錯誤詳細資料錯誤訊息通常表示憑證對於用戶端連線中使用的主機名稱以外的主機名稱有效。例如:T...
    程式設計 發佈於2024-12-21
  • 如何處理 SQL 資料庫中多個表的外鍵關係?
    如何處理 SQL 資料庫中多個表的外鍵關係?
    處理多個表的外鍵您有三個表:地區、國家和州。國家和國家可以屬於地區,形成等級結構。現在,您想要建立一個包含「region_id」和「popular_place_id」欄位的「popular_areas」表,並基於「popular_place_type」列在「popular_place_id」與國家或...
    程式設計 發佈於2024-12-21
  • Go 是否為 Goroutine 特定資料提供 ThreadLocal 等效項?
    Go 是否為 Goroutine 特定資料提供 ThreadLocal 等效項?
    了解Go 中的Goroutine-本地儲存在使用Go 時,開發者經常會遇到需要追蹤與特定Goroutine 相關的資訊的情況。在 Java 等其他語言中,ThreadLocal 為此任務提供了一個優雅的解決方案。 Go 是否提供類似的機制? Go 的 Goroutine 本地儲存方法Go 的標準庫不...
    程式設計 發佈於2024-12-21
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-12-21
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSocke...
    程式設計 發佈於2024-12-21
  • 如何使用 Prototype.js 實作自動調整文字區域大小的功能?
    如何使用 Prototype.js 實作自動調整文字區域大小的功能?
    使用Prototype 實現自動調整大小的TextArea要增強內部銷售應用程式中的使用者體驗,請考慮向用於送貨地址的文字區域。以下是實現此目的的詳細指南:目標是創建一個可以動態調整其高度以適應文字輸入的文字區域,確保最佳的空間利用率和可讀性。為此,我們將利用 JavaScript 框架 Proto...
    程式設計 發佈於2024-12-21
  • Spring Boot如何配置多個資料來源?
    Spring Boot如何配置多個資料來源?
    在Spring Boot中配置多個資料來源在Spring Boot中,使用多個資料來源可以讓你隔離不同實體的資料存取管理或應用程式。為了實現這一點,使用了 application.properties 檔案和 Bean 配置方法。 application.properties若要新增第二個資料來源,...
    程式設計 發佈於2024-12-21
  • 為什麼 C++ 中的零長度陣列會導致錯誤 2233,如何修復它?
    為什麼 C++ 中的零長度陣列會導致錯誤 2233,如何修復它?
    在 C 中處理「零長度數組」 在 C 中,在遺留程式碼中可能會遇到「零長度數組」的情況。這涉及包含長度為零的陣列的結構。雖然警告被編譯指示抑制,但創建包含此類數組的新結構可能會導致錯誤 2233。為什麼會發生這種情況,可以採取什麼措施來解決它? 使用零長度數組的原因是一個歷史原因允許動態分配數組的...
    程式設計 發佈於2024-12-21
  • 如何設定 HTML `` 標籤的樣式並確保其可見性?
    如何設定 HTML `` 標籤的樣式並確保其可見性?
    HTML標籤的樣式和可見性問題聲明在HTML中,標籤用來定義一個區域可以連結到另一個資源的圖像。然而,使用者在設計樣式並使這些區域始終可見方面遇到了困難。 jQuery 外掛解決方案克服這項挑戰的一種方法是利用 MapHilight jQuery 外掛程式。該插件提供了使用 CSS 懸停效果突出顯示...
    程式設計 發佈於2024-12-21
  • 存取類別中的資料庫物件時如何避免全域變數?
    存取類別中的資料庫物件時如何避免全域變數?
    在類別中使用全域變數建立分頁功能涉及從類別中存取資料庫物件。但是,嘗試存取類別內部的外部變數可能會導致錯誤。讓我們深入研究處理此問題的可能解決方案。 為了解決致命錯誤“在非物件上呼叫成員函數 query()”,資料庫物件需要在類別中可存取。不使用全域變量,更合適的方法是將資料庫物件注入到類別或其方法...
    程式設計 發佈於2024-12-21
  • 如何在C++中產生特定範圍內均勻分佈的隨機數?
    如何在C++中產生特定範圍內均勻分佈的隨機數?
    跨範圍均勻隨機數產生您尋求一種在指定範圍[min, max]內均勻產生隨機數的方法。 rand 的缺陷您目前使用 rand() 和模運算子的實作可能無法確保均勻分佈,因為它的行為取決於 RAND_MAX 和範圍本身。 C 11 和統一範圍產生在C 11 中,std::uniform_int_dis...
    程式設計 發佈於2024-12-21

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3