在C ++中引入'和'和'或'替代令牌是什么时候?

时间:2009-02-17 04:08:51

标签: c++ syntax keyword digraphs trigraphs

我刚读过Reddit的这个nice piece

他们提到andor&&||

的“备用代币” 直到现在我才真正意识不到这些。当然,每个人都知道di-graphs and tri-graphs,但andor?从何时起?这是标准的最新成员吗?

我刚刚使用Visual C ++ 2008进行了检查,它似乎并没有将这些视为语法错误。发生了什么事?

8 个答案:

答案 0 :(得分:31)

从C ++ 11标准2.6/ Alternative tokens

  1. 为某些运营商和标点符号提供了替代令牌表示。
  2. 在语言的所有方面,除了拼写之外,每个备用标记的行为分别与其主标记相同。表2中定义了替代令牌集。
  3. 表2 - 替代令牌

    alternative primary | alternative primary | alternative primary
    --------------------+---------------------+--------------------
       <%          {    |    and         &&   |    and_eq      &=
       %>          }    |    bitor       |    |    or_eq       |=
       <:          [    |    or          ||   |    xor_eq      ^=
       :>          ]    |    xor         ^    |    not         !
       %:          #    |    compl       ~    |    not_eq      !=
       %:%:        ##   |    bitand      &    |
    

答案 1 :(得分:23)

仅当您使用/Za选项禁用扩展程序时,MSVC才支持它们作为关键字;这至少从VC7.1(VS2003)开始。

您可以通过加入iso646.h来支持它们作为宏。

我的猜测是他们认为默认情况下将它们设为关键字会破坏现有代码(如果它们是正确的话我也不会感到惊讶)。

几个星期前在这里的一个问题上讨论了这个问题,但是我无法通过SO的搜索或谷歌找到该死的东西。

答案 2 :(得分:10)

要真正回答这个问题:

它们是在第一个C ++标准中定义的。

答案 3 :(得分:4)

参见C ++标准。委员会草案#2可以在 ftp://ftp.research.att.com/dist/c++std/WP/CD2/body.pdf免费获取,虽然它在一些地方是非权威的,过时的,部分不正确的。具体来说,在第2.5节替代标记中,定义了以下内容:

Alternative Primary
<%          {
%>          }
<:          [
:>          ]
%:          #
%:%:        ##
and         &&
bitor       |
or          ||
xor         ^
compl       ~
bitand      &
and_eq      &=
or_eq       |=
xor_eq      ^=
not         !
not_eq      !=

虽然老实说,除了andornot之外,我从未见过任何使用它们,即便如此,这些也很少见。请注意,默认情况下,这些在纯C代码中是不允许的,仅在C ++中。如果你想在C中使用它们,你必须自己#define将它们作为宏,或#include标题<iso646.h>,它定义了上述所有内容,但{{1}除外} <% >% <: :> %:作为宏(请参阅C99标准的第7.9节)。

答案 4 :(得分:0)

您可能会惊讶地了解其余部分:

and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq

C++ Keywords列出。

我相信GCC的最新版本支持这些关键字。

答案 5 :(得分:0)

G ++有它们,但我不知道MS VC ++。

您可以将它放在代码文件的顶部来获得相同的功能。

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

虽然这有点像hackish,但它应该有用。

答案 6 :(得分:0)

虽然这个问题很老,但我想提供或多或少的完整答案: 替代令牌已经是当前撤回的C ++ 98(ISO/IEC 14882:1998的一部分,我相信这是C ++的第一个ISO标准)。 虽然本身不​​是证明(我不拥有c ++ 98的ISO副本),here's a link - see C++ section.

正如其他答案所述,当未指定 / Za 标志时,MSVC编译器违反了标准的 [lex.digraph] 部分。

答案 7 :(得分:-1)

它们出现在新C ++标准的工作文件中,第14页: C++ Standard