Ответ 1
Есть несколько таких альтернатив, определенных на С++. Возможно, вы можете использовать переключатели для включения/выключения.
У меня есть код, который выглядит так:
static const std::string and(" AND ");
Это приводит к ошибке в g++, например:
Row.cpp:140: error: expected unqualified-id before '&&' token
поэтому после проклятия дурака, который определил "и" как & &, я добавил
#ifdef and
#undef and
#endif
и теперь я получаю
Row.cpp:9:8: error: "and" cannot be used as a macro name as it is an operator in C++
Что приводит к моему вопросу о том, КОГДА "и" стал оператором на С++? Я не могу найти ничего, что указывает на это, за исключением, конечно, этого сообщения из g++
Есть несколько таких альтернатив, определенных на С++. Возможно, вы можете использовать переключатели для включения/выключения.
Из стандарта С++ 03, раздел 2.5:
2.5 Альтернативные жетоны
Для некоторых операторов и пунктуаторов предусмотрены альтернативные представления токенов. Во всех аспектах языка каждый альтернативный токен ведет себя одинаково, соответственно, как основной маркер, за исключением его орфографии. Набор альтернативных токенов определен в таблице 2.
Таблица 2 - альтернативные маркеры
alternative primary
<% {
%> }
<: [
:> ]
%: #
%:%: ##
and &&
bitor |
or ||
xor ˆ
compl ˜
bitand &
and_eq &=
or_eq |=
xor_eq ˆ=
not !
not_eq !=
Они были там с С++ 98. Они перечислены в стандарте §2.5/2 (издание 1998 или 2003 года). Альтернативные маркеры включают в себя: and
, or
, xor
, not
, bitand
, bitor
, compl
, and_eq
, or_eq
, xor_eq
, not
, not_eq
.
Вы можете использовать -fno-operator-names
, чтобы отключить это. Кроме того, вы можете называть свой объект std::string
чем-то другим!
В соответствии со стандартом С++ 2.12 существуют предопределенные токены препроцессора, которые используются в
синтаксис препроцессора или преобразовываются в токены для операторов и пунктуаторов. "and
- один из них. В новом стандарте С++ есть новый 2.12/2:
Кроме того, альтернативные представления, показанные в таблице 4 для некоторых операторов и пунктуаторов (2.6) , зарезервированы и не будут использоваться иначе:
and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq
Я не знаю, когда это было введено, возможно, это было с самого начала, но я считаю, что причина, по которой она существует, является альтернативой &&
для людей с ограниченными наборами символов, т.е. там, где они не имеют характер амперсанда.
Есть и многие другие, например. and_eq
, or
, compl
и not
, чтобы назвать только выбор.
Они были добавлены, потому что некоторые из этих символов трудно напечатать на некоторых клавиатурах.