为什么C编译器可以编译此代码,即使C++编译器不能?

NEW*_*IEE 3 c++ gcc

在过去,我被教导C++编译器一般可以编译C语言代码,除了混合C和C++代码.但是,我在这段代码中遇到了一个我无法理解的错误

该代码可以通过GCC的C语言编译器编译,但是GCC的C++编译器不能编译,因为下面这个错误代码,44|error: expected unqualified-id before ‘xor’ token|crc_update函数.

static uint16_t crc_update(uint16_t crc_in, int incr)
{
    uint16_t xor = crc_in >> 15;
    uint16_t out = crc_in << 1;

    if (incr)
        out++;

    if (xor)
        out ^= CRC_POLY;

    return out;
}
Run Code Online (Sandbox Code Playgroud)

是什么导致了这个错误

tas*_*oor 8

虽然很少使用,但是C++中xor关键字可以用作替代^.您不能将其用作变量名称.

  • @summerbulb:编译器无法知道您是否尝试将关键字用作非关键字.它只知道您尝试使用错误的关键字. (4认同)
  • 我想将其作为编译器输出... (2认同)
  • @LightnessRacesinOrbit:这不完全正确,编译器_does_有办法.遇到错误时,它可以用伪造的令牌替换令牌,看看是否能解决错误.这似乎是一种奇特的方法,但现有的编译器已经做了类似的替换.即许多编译器将使用空类型或"int"替换变量定义中的不完整类型.在这种情况下,用`__xor`替换`xor`的编译器会发现错误消失,因此可以安全地断定`关键字xor不能用作变量名`. (2认同)

Lun*_*din 6

有人试图标准化常用运营商的名称.引用C标准(C11 7.9),它们是:

and     &&
and_eq  &=
bitand  &
bitor   |
compl   ~
not     !
not_eq  !=
or      ||
or_eq   |=
xor     ^
xor_eq  ^=
Run Code Online (Sandbox Code Playgroud)

在C中,您可以使用左列中的名称作为相应运算符的等效名称,但仅限于您包含的名称<iso646.h>.但是,在C++中,左列中的所有内容都是保留关键字.

所以你应该避免在C和C++中使用它们作为变量名.

请参阅:https://en.wikipedia.org/wiki/C_alternative_tokens