Компилятор 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.
FDIS C ++ 11 говорит в "16.8 Предопределенные имена макросов [cpp.predefined]" that
Имя __cplusplus
определяется значением 201103L при компиляции модуля перевода C ++.(Сноска. Предполагается, что будущие версии этого стандарта заменят значение этого макроса большим значением. Несоответствующие компиляторы должны использовать значение не более пяти десятичных цифр.)
У старого стандарта C ++ 03 было похожее правило.
GCC намеренно устанавливает это значение на 1
, потому что оно "не соответствует" ?
Прочитав этот список, я подумал, что мог бы использовать __cplusplus
для проверки переносимости, если у меня есть компилятор с поддержкой C ++ 11.Но с g ++ это, похоже, не работает.Я знаю о макросе ...EXPERIMENTAL...
, но мне стало любопытно, почему g ++ определяет __cplusplus
таким образом.
Моя первоначальная проблема заключалась в переключении между различными вариантами нулевого указателя.Примерно так:
#if __cplusplus > 201100L
# define MYNULL nullptr
#else
# define MYNULL NULL
#endif
Существует ли простой и достаточно портативный способ реализовать такой переключатель?