不允许在c++中使用#define ^
#define ^ in c++ is not allowed
我不能像#define ^ +
那样使用#define
来给^
赋予单独的含义。但是,正如我能够用#define
赋予$
意义一样,就像#define $ +
一样。
你能告诉我$
和^
有什么不同吗
在c++标准的哪个规则上不允许使用此^
?
我使用的是VC++2012,没有尝试过GCC或任何其他工具。
^
是C++中的一个运算符。它是一个逐位XOR。请阅读https://www.tutorialspoint.com/cplusplus/cpp_operators.htm
运算符不能以这种方式"重新定义",您需要重载它们。C++允许在同一范围内为函数名或运算符指定多个定义,分别称为函数重载和运算符重载(https://www.tutorialspoint.com/cplusplus/cpp_overloading.htm和https://en.wikibooks.org/wiki/C%2B%2B_Programming/Operators/Operator_Overloading#Bitwise_operators)
对于逐位运算符,它们的优先级通常低于算术运算符,因此,如果^被重载进行幂运算,则x^y+z可能无法按预期工作。
对于XOR,规范形式为:Type operator^(const Type &lhs, const Type &rhs); // Bitwise exclusive or
,而对于成员函数版本:Type &operator^=(const Type &rhs); // Assign exclusive or
。
参考:http://articles.emptycrate.com/2009/10/12/nobody_understands_c_part_8_operator_overloading.html
预处理器宏名称的规则与标识符的规则相同:它们只能包含大小写字母、下划线和数字。标识符中的第一个字符不能是数字。
这意味着不可能使用#define
来重新定义像^
这样的运算符的含义。
在标准C++中,这也排除了包含$
的标识符。但是,有些编译器支持将$
作为扩展名的标识符。
^是一个运算符,您可以使用它来获得带有空格的字符串的输入,如scanf("%[^\n]s,&x)…所以您只能重载它,而不能定义它,因为它已经被定义为
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 如何以静态代码分析友好的方式使用 #define 防护?
- C++相当于整数的 #define
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 我们可以用 C 语言嵌套 #define 和 #if 吗?
- 如何将旧的 C 样式 #define 映射与现代C++进行调整?
- 找不到 #define 的函数定义
- "#define X X"是什么意思?
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- 野牛/flex:计算器将双精度值解释为整数,所以我添加了 YYSTYPE 双精度 #define 但我有多个编译错误
- 如何解决C++中声纳库贝静态代码分析错误"Explicitly define the missing copy constructor, move constructor .."
- c中 #define 的不足
- 使用 [#define & #ifdef] 跨文件激活代码块
- 如何避免#define语法的变量重新声明
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 使用 #define 声明函数
- #define 宏中的括号失败
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor