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