Когда «и» стал оператором в C ++ - PullRequest
27 голосов
/ 10 марта 2010

У меня есть некоторый код, который выглядит следующим образом:

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++

Что приводит к моему вопросу о том, КОГДА "и" стал оператором в C ++?Я не могу найти ничего, что указывает на это, кроме, конечно, это сообщение от G ++

Ответы [ 7 ]

25 голосов
/ 10 марта 2010

Из стандарта C ++ 03, раздел 2.5:

2.5 Альтернативные токены

Для некоторых операторов и знаков препинания предусмотрены альтернативные представления токенов. Во всех отношениях языка каждый альтернативный токен ведет себя так же, как и его основной токен, за исключением написания. Набор альтернативных токенов определен в таблице 2.

Таблица 2 - альтернативные токены

alternative primary 
  <%         { 
  %>         } 
  <:         [ 
  :>         ] 
  %:         # 
  %:%:       ## 
  and        && 
  bitor      | 
  or         || 
  xor        ˆ 
  compl      ˜ 
  bitand     & 
  and_eq     &= 
  or_eq      |= 
  xor_eq     ˆ= 
  not        ! 
  not_eq     != 
14 голосов
/ 10 марта 2010

Они были там с C ++ 98. Они перечислены в §2.5 / 2 стандарта (издание 1998 или 2003 года). Альтернативные токены включают в себя: and, or, xor, not, bitand, bitor, compl, and_eq, or_eq, xor_eq, not, not_eq.

9 голосов
/ 10 марта 2010

Вы можете использовать -fno-operator-names, чтобы отключить это. Кроме того, вы можете назвать свой std::string объект как-нибудь еще!

8 голосов
/ 10 марта 2010

Есть несколько таких альтернатив , определенных в C ++. Вероятно, вы можете использовать переключатели для включения / выключения.

5 голосов
/ 10 марта 2010

В соответствии со стандартом C ++ 2.12 существуют предопределенные токены препроцессора », которые используются в синтаксис препроцессора или преобразуются в токены для операторов и пунктуаторов. "and является одним из них. В новом стандарте C ++ появился новый 2.12 / 2:

Кроме того, альтернативные представления, показанные в таблице 4 для некоторых операторов и знаков препинания (2.6) , зарезервированы и не должны использоваться , иначе:

and and_eq bitand bitor compl not
not_eq or or_eq xor xor_eq
3 голосов
/ 10 марта 2010

Они были добавлены, потому что некоторые из этих символов трудно набирать на некоторых клавиатурах.

3 голосов
/ 10 марта 2010

Я не знаю, когда он был представлен, возможно, он был там с самого начала, но я считаю, что причина в том, что он существует как альтернатива && для людей с ограниченными наборами символов, то есть там, где они этого не делают. на самом деле имеет символ амперсанда.

Есть и много других, например. and_eq, or, compl и not, чтобы назвать только выбор.

...