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

时间:2017-01-04 09:44:01

标签: c++ gcc

过去,我被教导C ++编译器一般可以编译C语言代码,除了混合C和C ++代码。 但是,我遇到了一个我无法在this code

中理解的错误

此代码可以由GCC的C语言编译器编译,但由于44|error: expected unqualified-id before ‘xor’ token|函数中的crc_update错误,GCC的C ++编译器无法编译此代码。

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;
}

导致此错误的原因是什么?

3 个答案:

答案 0 :(得分:8)

虽然很少使用,但xorkeyword in C++,可用作^的替代方案。您不能将其用作变量名称。

答案 1 :(得分:6)

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

and     &&
and_eq  &=
bitand  &
bitor   |
compl   ~
not     !
not_eq  !=
or      ||
or_eq   |=
xor     ^
xor_eq  ^=

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

因此,您应该避免在C和C ++中将它们用作变量名。

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

答案 2 :(得分:3)

xor是C ++中的reserved word(但不是C语言)。