#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(+);
关于c++ - 使用宏声明运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27665274/