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
Есть ли простой и достаточно портативный способ реализовать такой переключатель?