不允许在c ++中使用#define ^

时间:2017-03-12 09:22:07

标签: c++ preprocessor

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

您能告诉我^select artist_id from service_schedule group by artist_id having sum(service_id in (5,6,1))=3 的不同之处吗? 关于c ++标准的规则,这个service_id in (5,6,1)是不允许的?

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

3 个答案:

答案 0 :(得分:4)

^是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

答案 1 :(得分:3)

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

这意味着无法使用#define重新定义^等运算符的含义。

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

答案 2 :(得分:-2)

^是一个操作符,你可以使用它来获取带有空格的字符串输入,就像这个scanf(“%[^ \ n] s,& x)...所以你只能重载它而不是将它定义为它已定义