【问题标题】:Declaring operators using macros使用宏声明运算符
【发布时间】:2014-12-27 07:25:18
【问题描述】:
#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;

【问题讨论】:

    标签: c++ macros operators operator-keyword


    【解决方案1】:

    说它声明一个全局操作符比实际定义它更准确。关键字是operator,运算符符号是一个单独的标记。而且您只能将标识符粘贴在一起,而不能将标识符和运算符符号粘贴在一起。

    因此,您可以通过删除 ## 来让第二个版本工作:

    #define DEFINE_GLOBAL_OPERATOR(SYMBOL) \
                X operator SYMBOL(const X &, const X &);
    
    struct X {};
    DEFINE_GLOBAL_OPERATOR(+);
    

    【讨论】:

      猜你喜欢
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多