【问题标题】:#define ^ in c++ is not allowed#define ^ 在 C++ 中是不允许的
【发布时间】:2017-03-12 09:22:07
【问题描述】:

我无法使用#define^ 赋予单独的含义,例如#define ^ +。 但是,我可以使用 #define$ 赋予意义,例如 #define $ +

能否告诉我$^ 有何不同?
这个^在c++标准的哪个规则上是不允许的?

我使用的是 VC++ 2012,未尝试使用 GCC 或任何其他工具。

【问题讨论】:

标签: c++ preprocessor


【解决方案1】:

^ 是 C++ 中的运算符。这是一个按位异或。请阅读https://www.tutorialspoint.com/cplusplus/cpp_operators.htm

运算符不能以这种方式“重新定义”,您需要重载它们。 C++允许在同一作用域内为函数名或运算符指定多个定义,分别称为函数重载和运算符重载(https://www.tutorialspoint.com/cplusplus/cpp_overloading.htmhttps://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 + -、#define * - 等
  • 如果你真的有一个 C 预处理器可以让你 #define 运算符符号,那么你肯定远离标准 C++
【解决方案2】:

预处理器宏的名称规则与标识符相同:它们只能包含大小写字母、下划线和数字。标识符中的第一个字符不能是数字。

这意味着不可能使用#define 来重新定义^ 等运算符的含义。

在标准 C++ 中,这也排除了包含 $ 的标识符。但是,一些编译器支持包含 $ 作为扩展名的标识符。

【讨论】:

  • "在标准 C++ 中,这也排除了包含 $ 的标识符。"它在 C++ 规范的任何部分中提到过吗?
  • @susanth:当然。它在第 2.10 节中,其中标识符被定义为以一个 53 个字符(大写和小写 ASCII 字母,加上_ 符号)开始,并以更多相同的字符开头,加上可能的 10 个 ASCII 数字。它们还可能包括“通用字符名称”,它们是以十六进制编码的 unicode 字符,用\u\U 表示,但只允许使用类似字母的字符,最小的有效代码是\u00A8。 (并且编译器可能允许您使用实际的 Unicode 字符。)16.3 第 10 段说 #define 后面必须跟一个标识符。
【解决方案3】:

^ 是一个运算符,您可以使用它来获取带有空格的字符串输入,例如 scanf ("%[^\n]s,&x)...所以您只能重载它而不是像它已经定义的那样定义它已定义

【讨论】:

  • ^ 是按位异或。和scanf有什么关系?
  • 在预处理中应该忽略“...”中的内容,对吧?
猜你喜欢
  • 1970-01-01
  • 2011-07-17
  • 2022-11-11
  • 2018-06-20
  • 1970-01-01
  • 2018-10-15
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多