c++ - 使用宏声明运算符

标签 c++ macros operators operator-keyword

#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/

相关文章:

c++ - 使用 opencv 和 c++ 跟踪帧序列中的某些特定点

c++ - 段错误 11 在不同机器上的行为

macros - 什么是宏@.来自 Julia,文档在哪里?

eclipse - 是否有用于在 m4 中开发的 eclipse 插件?

c++ - 使用cin函数在c++中输入数学运算

c++ - 打印 vector 的 vector

c++ - 比较c++中的排序函数以进行索引排序

c - Linux内核FIELD_SIZEOF宏解释

javascript - 这些 JavaScript 按位运算符有什么作用?

c# - 你如何在 C# 中返回 'not uint'?