使用宏声明运算符

Declaring operators using macros

本文关键字:运算符 声明      更新时间:2023-10-16
#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(+);