[英]Declaring operators using macros
#define DECLARE_GLOBAL_OPERATOR(OPERATOR) \
X OPERATOR(const X &, const X &);
struct X {};
DECLARE_GLOBAL_OPERATOR(operator+);
上面的代碼聲明了一個直覺期望的全局加法運算符,但是一個簡單的變體(宏僅接受該運算符)在Clang 3.5.0和ideone上不起作用(使用C ++ 11測試)。
#define DECLARE_GLOBAL_OPERATOR(SYMBOL) \
X operator##SYMBOL(const X &, const X &);
struct X {};
DECLARE_GLOBAL_OPERATOR(+);
在此,Clang抱怨說pasting formed 'operator+', an invalid preprocessing token
而ideone輸出pasting "operator" and "+" does not give a valid preprocessing token
。 此代碼格式錯誤嗎?
請注意,下面的代碼可以編譯並執行良好,因此問題似乎與將+
, -
, x
或/
參數傳遞給宏無關。
#define WHATEVER(SYMBOL) \
int value = 2 SYMBOL 4;
說它聲明一個全局運算符比實際定義它更准確。 關鍵字是operator
,而運算符是單獨的標記。 而且,您只能將標識符粘貼在一起,而不能將標識符和操作員符號粘貼在一起。
因此,您可以通過刪除##
來獲得第二個版本:
#define DEFINE_GLOBAL_OPERATOR(SYMBOL) \
X operator SYMBOL(const X &, const X &);
struct X {};
DEFINE_GLOBAL_OPERATOR(+);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.