2016-03-21 2 views
3

Я обнаружил, что написание#elseif против #elif (C/C++ препроцессор)

#ifdef ... 
#elseif defined(...) 
#else 
#endif 

всегда приводит либо с помощью #ifdef или #ELSE состояние, никогда в #elseif. Но замена #elif заставляет его работать как ожидалось в зависимости от того, что определено. Какая запутанная цель, если таковая имеется, обслуживается существованием #elseif? А если нет, то почему препроцессор не жалуется?

Возможно, поэтому в течение многих лет (на самом деле, десятилетия) я использовал уродливые блоки # else/# endif, так как по крайней мере они надежны!

+0

Если значение после '# ifdef' определено, вы должны увидеть ошибку« Недопустимая препроцессорная ошибка ». ([Пример] (http://ideone.com/FCPtSD)) – molbdnilo

ответ

9

#elseif не определен. Препроцессор не жалуется, потому что ваш #ifdef является ложным, а директивы в этом блоке #ifdef не анализируются. Чтобы проиллюстрировать это, этот код действителен:

#if 0 
#random nonsense 
#else 
// This must be valid 
#endif