首頁 >後端開發 >C++ >如何處理複雜 C/C 巨集參數中的逗號?

如何處理複雜 C/C 巨集參數中的逗號?

Linda Hamilton
Linda Hamilton原創
2024-12-11 06:45:09734瀏覽

How Can I Handle Commas in Complex C/C   Macro Arguments?

C/C 巨集中的逗號

在 C/C 巨集中,通常需要用逗號分隔多個參數。但是,當巨集需要特定數量的參數時,就會出現問題,並且提供更多或更少會導致錯誤。

問題場景

考慮定義如下的巨集:

#define FOO(type, name) type name

雖然這個宏可以簡單地使用,例如:

FOO(int, int_var);

涉及複雜類型時就會出現問題:

FOO(std::map<int, int>, map_var); // error: macro "FOO" passed 3 arguments, but takes just 2

傳統解決方案

一個常見的方法是建立一個新型別別名並在巨集:

typedef std::map<int, int> map_int_int_t;
FOO(map_int_int_t, map_var); // OK

基於巨集的解

或者,您可以定義一個代表逗號的宏:

#define COMMA ,

使用此宏,您現在可以傳遞複雜類型,而無需錯誤:

FOO(std::map<int COMMA int>, map_var);

其他用例

這種方法在字串化巨集參數時也很有用,如下所示:

#include <cstdio>
#include <map>
#include <typeinfo>

#define STRV(...) #__VA_ARGS__
#define COMMA ,
#define FOO(type, bar) bar(STRV(type) \
    " has typeid name \"%s\"", typeid(type).name())

int main()
{
    FOO(std::map<int COMMA int>, std::printf);
}

This程式碼將列印:
std::map;具有 typeid 名稱“St3mapIiiSt4lessIiESaISt4pairIKiiEEE”

以上是如何處理複雜 C/C 巨集參數中的逗號?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn