Gnu C ++ макрос __cplusplus соответствует стандарту?

Компилятор Gnu C ++, кажется, определяет __ cplusplus как 1

#include  
int main() {
  std::cout << __cplusplus << std::endl;
}

Это печатает 1 с помощью gcc в в стандартном режиме C ++, а также в режиме C ++ 0x с gcc 4.3.4 и gcc 4.7.0.

C ++ 11 FDIS говорит в «16.8 Предопределенные имена макросов [cpp.predefined]» , что

Имя __ cplusplus определяется значением 201103L при компиляции единицы трансляции C ++. (Сноска: предполагается, что в будущих версиях этого стандарта значение этого макроса будет заменено на большее значение. Несоответствующие составители com - должны использовать значение, содержащее не более пяти десятичных цифр.)

В старом стандартном C ++ 03 было аналогичное правило.

GCC намеренно устанавливает это значение на 1 , потому что это «несоответствие» ?

Прочитав этот список, я подумал, что могу использовать __ cplusplus , чтобы проверить переносимым способом, есть ли у меня компилятор с поддержкой C ++ 11. Но с g ++ это не работает. Я знаю о макросе ... EXPERIMENTAL ... , но мне стало любопытно, почему g ++ определяет __ cplusplus таким образом.

Моя первоначальная проблема заключалась в переключении между различными вариантами нулевого указателя. Примерно так:

#if __cplusplus > 201100L
#  define MYNULL nullptr
#else
#  define MYNULL NULL
#endif

Есть ли простой и достаточно переносимый способ реализовать такой переключатель?

32
задан towi 27 September 2011 в 13:49
поделиться