Reddit からこの素敵な記事を読みました。
彼らは言及and
し、or
「代替トークン」で&&
あり、||
私は今までこれらのことをまったく知りませんでした。もちろん、ダイグラフとトリグラフについては誰もが知っていますが、and
とor
? いつから?これは標準への最近の追加ですか?
Visual C++ 2008 で確認したところ、これらは構文エラー以外のものとして認識されないようです。どうしたの?
最初のISO C++ 標準からC++98
、これは で説明されてい2.5/ Alternative tokens [lex.digraph]
ます。
Table 2 - Alternative tokens
alternative primary | alternative primary | alternative primary
--------------------+---------------------+--------------------
<% { | and && | and_eq &=
%> } | bitor | | or_eq |=
<: [ | or || | xor_eq ^=
:> ] | xor ^ | not !
%: # | compl ~ | not_eq !=
%:%: ## | bitand & |
したがって、C++ 標準化プロセスの初期の頃から存在しています。ほとんどの人がそれを認識していない理由は、主な使用例が、完全な文字セットが必ずしも利用可能ではない環境で操作する人々のためだった可能性があります。たとえば (これは私の記憶を拡張しています)、IBM メインフレームのベースライン EBCDIC 文字セットには、角かっこ文字[
と]
.
/Za
MSVC は、拡張機能を無効にするオプションを使用する場合にのみ、それらをキーワードとしてサポートします。これは、少なくとも VC7.1 (VS2003) から当てはまります。
を含めることで、それらをマクロとしてサポートすることができますiso646.h
。
私の推測では、デフォルトでそれらをキーワードにすると、既存のコードがあまりにも多く壊れてしまうと彼らは信じているのでしょう (そして、彼らが正しかったとしても私は驚かないでしょう)。
実際に質問に答えるには:
それらは最初の C++ 標準で定義されました。
C++ 標準を参照してください。委員会草案 #2 は、次のサイトで自由に入手できます。ftp://ftp.research.att.com/dist/c++std/WP/CD2/body.pdfですが、権威がなく、時代遅れで、いくつかの場所で部分的に正しくありません。具体的には、セクション 2.5「代替トークン」では、次のものが定義されています。
代替プライマリ <% { %> } <: [ :> ] %: # %:%: ## と && バイター | または || xor ^ 完了〜 ビットと & and_eq &= or_eq |= xor_eq ^= いいえ ! not_eq !=
正直なところ、 、 、 、 以外で使用されているのを見たことがなくand
、or
それでもnot
まれです。これらは、プレーン C コードではデフォルトで許可されておらず、C++ でのみ許可されていることに注意してください。それらを C で使用したい場合は、#define
それらを自分でマクロとして使用するか、マクロとして以外の上記のすべてを定義#include
する headerを使用する必要があります (C99 標準のセクション 7.9 を参照)。<iso646.h>
<%
>%
<:
:>
%:
%:%:
質問は古いですが、多かれ少なかれ完全な回答を提供したいと思います。代替トークンは、現在廃止されている C++98 ( ISO/IEC 14882:1998、私が信じている最初のC++ の ISO 標準)。それ自体は証明ではありませんが (私は c++98 用の ISO のコピーを所有していません)、ここにリンクがあります - C++ セクションを参照してください。
他の回答で述べたように、/Zaフラグが指定されていない場合、MSVC コンパイラは標準の[lex.digraph]セクションに違反しています。
GNU コンパイラ 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 !=
これはちょっとハックですが、うまくいくはずです。
それらの残りの部分について知って驚くかもしれません:
and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq
C++ Keywordsからのリスト。
GCC の最近のバージョンでは、これらのキーワードがサポートされていると思います。
これらは、新しい C++ 標準のワーキング ペーパーの 14 ページに記載されています: C++ 標準