使用接受多個參數的巨集時可能會遇到困難,特別是當參數包含逗號時。考慮以下範例:
#define FOO(type, name) type name
雖然將巨集與下列參數一起使用很簡單:
FOO(int, int_var);
處理涉及逗號的複雜參數時會出現問題,例如:
FOO(std::map<int, int>, map_var); // Error: 3 arguments passed to macro 'FOO', which takes only 2
為了解決這個問題,可以引入一種自訂類型定義:
typedef std::map<int, int> map_int_int_t; FOO(map_int_int_t, map_var); // Compiles successfully
但是,這種方法缺乏人體工學,並且需要額外的類型轉換。
另一個解決方案是定義一個名為 COMMA 的巨集:
#define COMMA ,
這樣定義時,可以使用 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); }
此程式碼將輸出:“ std::map
以上是如何處理 C/C 中宏參數中的逗號?的詳細內容。更多資訊請關注PHP中文網其他相關文章!