为什么字符串concat宏不适用于这种“ +”情况?

陈洪旭

简短问题:

是否允许Concat的特殊标志,如+-对于字符串连接宏##例如,

#define OP(var) operator##var

OP(+)扩大到operator+

确切的问题:

#include "z3++.h"
#include <unordered_map>

namespace z3 {
z3::expr operator+(z3::expr const &, z3::expr const &);
}

typedef z3::expr (*MyOperatorTy)(z3::expr const &, z3::expr const &);

#define STR(var) #var
#define z3Op(var) static_cast<MyOperatorTy>(&z3::operator##var)
#define StrOpPair(var) \
  { STR(var), z3Op(var) }

void test() {
  std::unordered_map<std::string, MyOperatorTy> strOpMap1{
      {"+", static_cast<MyOperatorTy>(&z3::operator+)}};  // fine
  std::unordered_map<std::string, MyOperatorTy> strOpMap2{StrOpPair(+)}; // error
}

对于strOpMap2,使用clang++ -c -std=c++11,它报告:

error: pasting formed 'operator+', an invalid preprocessing token

在使用时g++ -c -std=c++11,它给出:

error: pasting "operator" and "+" does not give a valid preprocessing token

通过阅读gcc的手册,我发现应该可以进行合并了,但是为什么两个编译器都出错?

MM

您可以粘贴标点符号以形成其他标点符号,例如

#define PASTE(a,b) a##b

int main()
{
     int i = 0;
     i PASTE(+,+);
     // i == 1 now
}

##操作员是用于产生一个有效的令牌预处理从其它预处理标记。粘贴的结果必须是有效的预处理令牌。因此,这是无效的:

PASTE(i,++)

因为i++不是预处理令牌;这是两个相邻的标记i++

可能的令牌列表为(N3797):

  • 标头名称
  • 识别码
  • pp号
  • 人物文学
  • 用户定义的字符字面量
  • 字符串字面量
  • 用户定义的字符串字面量
  • 预处理操作或标点
  • 每个非空格字符,不能为上述之一

注意:在预处理阶段,关键字不存在;但经过预处理后,所有应作为关键字的标识符都将(语义地)转换为关键字。因此,您可以通过粘贴较短的单词来构建关键字。

在您的代码中,operator+有两个标记:operator+因此,您不要使用##你只做一个然后另一个。

#define OP(punc) operator punc

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

android与空间分裂不适用于这种情况。为什么?

来自分类Dev

ng-submit不适用于这种情况

来自分类Dev

为什么网络策略入口不适用于我的情况

来自分类Dev

是否适用于在不使用数组的情况下将指向字符的指针(在为其分配字符串之后)传递给方法和修改此字符串,为什么不呢?

来自分类Dev

在矩阵中找到最短路径总和。Dijkstra是否不适用于这种情况?

来自分类Dev

为什么在这种情况下我不必引用字符串变量?

来自分类Dev

我的字符串扩展在 appDelegate 之前运行 为什么会发生这种情况?

来自分类Dev

无法弄清楚为什么我的代码不适用于特殊情况(从Leetcode更换硬币)

来自分类Dev

RewriteRule适用于一种情况,但不适用于其他情况

来自分类Dev

代码适用于一种情况,但不适用于其他情况

来自分类Dev

静态Google地图不适用于我的情况

来自分类Dev

不适用于语法错误的某些值的情况

来自分类Dev

窗口滚动不适用于其他情况

来自分类Dev

ng-options不适用于基本情况

来自分类Dev

Mod_rewrite 不适用于某些边缘情况

来自分类Dev

字符串索引超出范围:2不知道为什么会出现这种情况

来自分类Dev

case_when 适用于一种情况,而不适用于另一种情况

来自分类Dev

内置函数不适用于求值字符串,为什么?

来自分类Dev

为什么std :: uppercase不适用于字符串?

来自分类Dev

为什么 C# 编组字符串不适用于 C++ DLL

来自分类Dev

在这种情况下,字符串存储的最佳解决方案是什么?

来自分类Dev

SAS适用于以下情况

来自分类Dev

为什么`newtype` 不适用于这种模式匹配?

来自分类Dev

字符串被视为null但已分配了一个值,为什么会发生这种情况?(使用C#)

来自分类Dev

为什么JavaScript中的`btoa`编码适用于20位数字的字符串而不适用于20位数字的int?

来自分类Dev

Vue如何在本地复制数组以进行编辑?为什么它适用于字符串而不适用于数组?

来自分类Dev

为什么JavaScript中的`btoa`编码适用于20位数字的字符串而不适用于20位数字的int?

来自分类Dev

为什么这种 curl 用法适用于 Windows 而不适用于 OSX / iOS?

来自分类Dev

width.find('。')适用于第一种情况,尽管使用相同的代码,但不适用于第二种情况

Related 相关文章

  1. 1

    android与空间分裂不适用于这种情况。为什么?

  2. 2

    ng-submit不适用于这种情况

  3. 3

    为什么网络策略入口不适用于我的情况

  4. 4

    是否适用于在不使用数组的情况下将指向字符的指针(在为其分配字符串之后)传递给方法和修改此字符串,为什么不呢?

  5. 5

    在矩阵中找到最短路径总和。Dijkstra是否不适用于这种情况?

  6. 6

    为什么在这种情况下我不必引用字符串变量?

  7. 7

    我的字符串扩展在 appDelegate 之前运行 为什么会发生这种情况?

  8. 8

    无法弄清楚为什么我的代码不适用于特殊情况(从Leetcode更换硬币)

  9. 9

    RewriteRule适用于一种情况,但不适用于其他情况

  10. 10

    代码适用于一种情况,但不适用于其他情况

  11. 11

    静态Google地图不适用于我的情况

  12. 12

    不适用于语法错误的某些值的情况

  13. 13

    窗口滚动不适用于其他情况

  14. 14

    ng-options不适用于基本情况

  15. 15

    Mod_rewrite 不适用于某些边缘情况

  16. 16

    字符串索引超出范围:2不知道为什么会出现这种情况

  17. 17

    case_when 适用于一种情况,而不适用于另一种情况

  18. 18

    内置函数不适用于求值字符串,为什么?

  19. 19

    为什么std :: uppercase不适用于字符串?

  20. 20

    为什么 C# 编组字符串不适用于 C++ DLL

  21. 21

    在这种情况下,字符串存储的最佳解决方案是什么?

  22. 22

    SAS适用于以下情况

  23. 23

    为什么`newtype` 不适用于这种模式匹配?

  24. 24

    字符串被视为null但已分配了一个值,为什么会发生这种情况?(使用C#)

  25. 25

    为什么JavaScript中的`btoa`编码适用于20位数字的字符串而不适用于20位数字的int?

  26. 26

    Vue如何在本地复制数组以进行编辑?为什么它适用于字符串而不适用于数组?

  27. 27

    为什么JavaScript中的`btoa`编码适用于20位数字的字符串而不适用于20位数字的int?

  28. 28

    为什么这种 curl 用法适用于 Windows 而不适用于 OSX / iOS?

  29. 29

    width.find('。')适用于第一种情况,尽管使用相同的代码,但不适用于第二种情况

热门标签

归档