Если код в вашем вопросе компилируется без ошибок, либо вы на самом деле не компилируете в режиме C99, либо (что менее вероятно) ваш компилятор содержит ошибки. Или код неполный, и есть #include <iso646.h>
, который вы нам не показали.
Скорее всего, вы на самом деле вызываете свой компилятор в режиме C++. Чтобы проверить это, попробуйте добавить объявление вроде:
int class;
Компилятор C примет это; компилятор C++ отклонит его как синтаксическую ошибку, поскольку class
является ключевым словом. (Это может быть немного надежнее, чем тестирование макроса __cplusplus
; неправильно сконфигурированная система разработки может вызвать компилятор C++ с препроцессором в режиме C.)
В C99 заголовок <iso646.h>
определяет 11 макросов, которые обеспечивают альтернативные варианты написания для определенных операторов. Один из них
#define and &&
Итак, вы можете написать
if(temp1 ==0 and temp2 == 0)
в C только, если у вас есть #include <iso646.h>
; в противном случае это синтаксическая ошибка.
<iso646.h>
был добавлен в язык поправкой 1995 года к стандарту ISO C 1990 года, поэтому для его использования даже не нужен C99-совместимый компилятор.
В C++ заголовок не нужен; те же токены, определенные как макросы <iso646.h>
C, являются встроенными альтернативными вариантами написания. (Они определены в том же разделе стандарта C++, 2.6 [lex.digraph], что и орграфы, но в сноске поясняется, что термин «диграф» не применяется к лексическим ключевым словам, таким как and
.) В соответствии со стандартом C++ говорит:
Во всех аспектах языка каждая альтернативная лексема ведет себя так же, как и ее первичная лексема, за исключением своего правописания.
Вы можете использовать #include <ciso646>
в программе на C++, но в этом нет смысла (хотя это повлияет на поведение #ifdef and
).
На самом деле я бы не советовал использовать альтернативные токены ни в C, ни в C++, если только вам это действительно не нужно (скажем, в очень редком случае, когда вы работаете в системе, где вы не можете легко ввести символ &
). Хотя они более удобочитаемы для непрограммистов, они, вероятно, будут менее удобочитаемы для кого-то с приличным знанием языка C и/или C++, о чем свидетельствует тот факт, что вы задать этот вопрос.
person
Keith Thompson
schedule
12.08.2013