首頁 > 後端開發 > C++ > 如何在具有多個參數的 C/C 巨集中正確處理逗號?

如何在具有多個參數的 C/C 巨集中正確處理逗號?

Patricia Arquette
發布: 2024-12-11 16:19:20
原創
391 人瀏覽過

How Can I Handle Commas Correctly in C/C   Macros with Multiple 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:

typedef std::map<int, int> map_int_int_t;
FOO(map_int_int_t, map_var); // OK
登入後複製

雖然這種方法有效,但可能很麻煩並引入類型相容性問題。

另一個解決方案是使用預處理器的 COMMA Macro:

#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);
}
登入後複製

此程式碼列印:

std::map<int , int> has typeid name "St3mapIiiSt4lessIiESaISt4pairIKiiEEE"
登入後複製

透過使用COMMA 宏,開發人員可以避免typedef 並確保逗號在巨集中正確處理。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板