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

3
过去,我曾被教导C++编译器通常可以编译C语言代码,但不包括混合C和C++代码。然而,在这段代码中,我遇到了一个无法理解的错误。
这段代码可以通过GCC的C语言编译器进行编译,但是由于函数中出现了44|error: expected unqualified-id before ‘xor’ token|的错误,因此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;
}

这个错误是由什么引起的?

9
我被教导过,C++编译器可以编译C语言代码。 您被教导错误了。自从C++开始以来,C语言和C++已经越来越不同了。 - user694733
1
C和C++是不同的编程语言。即使代码可以使用两个编译器编译,它们的语义可能不同。将一个编译为另一个是严格禁止的。关于答案:这些绝对不是唯一的区别。有些差异更微妙,而其他差异则很明显。 - too honest for this site
1
那段代码看起来不像是一个 MCVE(最小可复现例子)。 - nonsensickle
1
@Lundin 糟糕,我的错。嗯,在进一步尝试后,Godbolt可能不是在这里使用的最佳资源,所以我会删除我的评论。 - nonsensickle
1
如果您阅读其他问题的一些评论,您会注意到正是这样。C/C++ 是未定义行为。 - too honest for this site
显示剩余3条评论
3个回答

8

虽然很少使用,但xor是C++中的一个关键字,可以作为^的替代品使用。您不能将其用作变量名。


感谢您的及时回复。我明白了! - NEWBIEEBIEE
2
我期望那个会在编译器输出中出现... - summerbulb
4
编译器无法知道您试图将关键字用作非关键字。它只知道您试图错误使用关键字。 - Lightness Races in Orbit
2
@LightnessRacesinOrbit:这并不完全正确,编译器确实有一种方法。当遇到错误时,它可以用一个虚构的标记替换该标记,看看是否解决了错误。这可能看起来像是一种奇特的方法,但现有的编译器已经做出了类似的替换。也就是说,许多编译器会将变量定义中的不完整类型替换为空类型或 int。在这种情况下,一个将 xor 替换为 __xor 的编译器将发现错误消失了,因此它可以安全地得出结论:关键字 xor 不能用作变量名 - MSalters
如果我本来想把它用作关键字,但是写错了,然后自动替换恰好使该行有效呢?那么我的诊断就是错误的。 - Lightness Races in Orbit
@LightnessRacesinOrbit:那么,诊断将告诉您使用关键字xor作为变量名(即不是作为运算符),因此诊断仍然是正确的。但是,想出好的诊断是一个非常困难的问题。我个人认为陈述中最大的问题是“替换the token”-哪个token?编译器有一系列无法编译的标记,但找到嫌疑人并不容易。特别是在这里,当前的诊断建议编译器在xor之前缺少一个标记。显然这是错误的,因为插入标记没有帮助。 - MSalters

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

现在为什么要踩我呢...我在回答中没有发现任何错误。 - Lundin
抱歉,我无法理解stackoverflow系统的行为。 - NEWBIEEBIEE

3

xor 是C++中的 保留字(但不是在C语言中)。


谢谢。我以后会注意的。 - NEWBIEEBIEE
1
“xor”在C语言中不是保留字,但如果您(或后续的维护者)#include iso646.h头文件,则它将被替换为宏 - 因此最好还是避免使用。 - Martin Bonner supports Monica
@Martin,感谢您的专业建议。 - NEWBIEEBIEE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接