Условное выражение может
содержать любой оператор C за исключением
операторы присваивания, приращения и
операторы декремента.
Это говорит, что вы не можете написать это,
#if X = 4 //wrong
#if X++ //this too wrong
#if X-- //this too
EDIT:
Я только что прочитал ваш комментарий к сообщению Диего Севильи ,
Согласен, но почему-то так
(ideone.com/ahXDA) не разрешено? -
Philando Gullible
Этот код фактически эквивалентен тому, который вы пишете в глобальной области видимости,
//global code
int b=7;
b++; //ill-formed!
Что не разрешено в C (и C ++). Это, однако, разрешено только в C,
//legal in C Only
int b = 7;
int b; //well-formed!
Здесь второе определение называется предварительное определение . Стандарт C говорит в $ 6,9,2 / 2,
Объявление идентификатора для
объект, который имеет область видимости без
инициализатор и без
спецификатор класса хранения или с
статический спецификатор класса хранения,
составляет предварительное определение . Если единица перевода содержит одно или несколько предварительных определений для идентификатора, а единица перевода не содержит внешнего определения для этого идентификатора, то поведение точно такое, как если бы единица перевода содержит файл объявление области этого идентификатора с составным типом на конец единицы перевода, с инициализатором, равным 0.
Что опять же означает, что следующее не разрешено,
//illegal in both C and C++
int b=7;
int b=8; //error
Это уже не предварительное определение. Это переопределение, которое не допускается!