Когда в C++ появились альтернативные токены «и» и «или»?
Вопрос
Я только что прочитал это хорошая штука из Реддита.
Они упоминают and
и or
будучи «Альтернативными токенами» для &&
и ||
Я действительно не знал об этом до сих пор.Конечно, все знают о диграфы и триграфы, но and
и or
?С каких пор?Это недавнее дополнение к стандарту?
Я только что проверил это с помощью Visual C++ 2008, и он, похоже, не распознает в этом ничего, кроме синтаксической ошибки.Что происходит?
Решение
MSVC поддерживает их как ключевые слова, только если вы используете /Za
возможность отключения расширений;это верно, по крайней мере, для VC7.1 (VS2003).
Вы можете обеспечить их поддержку в виде макросов, включив iso646.h
.
Я предполагаю, что они считают, что использование ключевых слов по умолчанию приведет к поломке слишком большого количества существующего кода (и я не удивлюсь, если они правы).
Это обсуждалось в вопросе пару недель назад где-то здесь, на SO, но я не могу заставить поиск SO или Google найти эту чертову штуку.
Другие советы
Из стандарта 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, хотя он неавторитетный, устаревший и в некоторых местах частично неверный.В частности, в разделе 2.5. Альтернативные токены, определены следующие:
Alternative Primary <% { %> } <: [ :> ] %: # %:%: ## and && bitor | or || xor ^ compl ~ bitand & and_eq &= or_eq |= xor_eq ^= not ! not_eq !=
Хотя, честно говоря, я никогда не видел, чтобы кто-то из них использовался, за исключением and
, or
, и not
, и даже тогда это редкость.Обратите внимание, что по умолчанию они НЕ разрешены в простом коде C, а только в C++.Если вы хотите использовать их в C, вам придется либо #define
их самостоятельно как макросы или #include
заголовок <iso646.h>
, который определяет все вышеперечисленное, кроме <%
>%
<:
:>
%:
%:%:
как макросы (см. раздел 7.9 стандарта C99).
Вы можете быть удивлены, узнав об остальных:
and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq
Список из Ключевые слова С++.
Я считаю, что последние версии GCC поддерживают эти ключевые слова.
Хотя вопрос старый, хотелось бы дать на него более-менее полный ответ:Альтернативные токены уже были частью отзываемого в настоящее время C++98 (ИСО/МЭК 14882:1998., который, как мне кажется, был первым стандартом ISO для C++).Хотя это и не является доказательством само по себе (и у меня нет копии ISO для C++98), вот ссылка - см. раздел C++.
Как упоминалось в других ответах, компилятор 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 !=
Хотя это своего рода хакерство, оно должно работать.
Они находятся в рабочем документе нового стандарта C++ на странице 14:Стандарт С++