什么时候在C ++中引入了“和”或“或”替代令牌?
我刚刚从Reddit阅读这个好的一块 。
他们提及and
正在or
正在成为&&
和||
“替代令牌”
直到现在我才真正意识到这些。 当然,大家都知道di-graph和tri-graph ,但and
和or
? 从何时起? 这是最近添加到标准?
我刚刚使用Visual C ++ 2008进行了检查,似乎并没有将这些识别为语法错误以外的任何东西。 这是怎么回事?
只有当您使用/Za
选项禁用扩展时,MSVC才将其作为关键字支持; 这至less从VC7.1(VS2003)是真实的。
你可以通过包含iso646.h
来获得它们作为macros的支持。
我的猜测是他们认为,默认情况下关键字会打破现有的代码(如果他们是正确的,我不会感到惊讶)。
在几个星期前的某个地方,这个问题已经在讨论,但是我不能得到SO的search或Google来find这个该死的东西。
从C ++ 11标准2.6/ Alternative tokens
:
- 为一些运营商和标点符号提供了替代的令牌表示。
- 在语言的所有方面,除了拼写外,每个替代标记的行为与其主标记相同。 表2中定义了一组替代令牌。
表2-替代令牌
alternative primary | alternative primary | alternative primary --------------------+---------------------+-------------------- <% { | and && | and_eq &= %> } | bitor | | or_eq |= <: [ | or || | xor_eq ^= :> ] | xor ^ | not ! %: # | compl ~ | not_eq != %:%: ## | bitand & |
要真正回答这个问题:
它们是在第一个C ++标准中定义的。
请参阅C ++标准。 委员会草案#2免费提供在ftp://ftp.research.att.com/dist/c++std/WP/CD2/body.pdf ,尽pipe它是非权威的,过时的,部分在一些地方不正确。 具体来说,在第2.5节“ 替代令牌 ”中定义了以下内容:
另类小学 <%{ %>} <:[ :>] %:# %:%:## 和&& bitor | 或|| xor ^ compl〜 bitand& and_eq&= or_eq | = xor_eq ^ = 不! not_eq!=
虽然老实说,我从来没有见过任何人用过,除了and
, or
,而not
,甚至那些,那些都是很less见的。 请注意,这些默认情况下不允许在纯C代码中使用,只能在C ++中使用。 如果你想在C中使用它们,你必须自己定义为macros,或者#include
头<iso646.h>
,它定义了除<%
>%
<:
%:
%:%:
作为macros(参见C99标准的第7.9节)。
G ++有他们,但我不知道MS VC ++。
通过将它放在代码文件的顶部,可以获得相同的function。
#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 !=
虽然这有点怪异,但它应该起作用。
您可能会惊讶于了解其他人:
and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq
从C ++关键字列表。
我相信最近版本的GCC支持这些关键字。
虽然这个问题很古老,但我想提供一个或多或less的完整答案:替代令牌已经是当前撤回的C ++ 98的一部分( ISO / IEC 14882:1998 ,我相信它是第一个C ++的ISO标准)。 虽然本身并不是一个certificate(而且我没有拥有c ++ 98的ISO副本),但这里有一个链接 – 参见C ++部分。
正如其他答案中所提到的,当/ Za标志没有被指定时,MSVC编译器违反了标准的[lex.digraph]部分。
它们在第14页上的新C ++标准的工作文件中: C ++ Standard