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

Компилятор Gnu C ++, кажется, определяет__cplusplus быть1

#include <iostream> 
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 ++. (Сноска. Предполагается, что будущие версии этого стандарта заменят значение этого макроса на большее значение. Несоответствующие компиляторы должны использовать значение не более пяти десятичных цифр.)

У старого стандарта C ++ 03 было похожее правило.

GCC намеренно устанавливает это1потому что это "не соответствует"?

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

Моей первоначальной проблемой было переключение между различными вариантами null-pointer. Что-то вроде этого:

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

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

Ответы на вопрос(1)

Ваш ответ на вопрос