Компилятор Gnu С++, по-видимому, определяет __cplusplus
как 1
#include <iostream>
int main() {
std::cout << __cplusplus << std::endl;
}
Это печатает 1
с gcc в стандартном режиме С++, а также в режиме С++ 0x с gcc 4.3.4 и gcc 4.7.0.
С++ 11 FDIS говорит в "16.8 предопределенных именах макросов [cpp.predefined]", которые
При компиляции единицы перевода С++ имя
__cplusplus
определяется значением 201103L. (Сноска: предполагается, что будущие версии этого стандарта заменят значение этого макроса на большее значение. пипец должен использовать значение не более пяти десятичных цифр.)
Старый std С++ 03 имел аналогичное правило.
Является ли GCC намеренно установкой этого параметра на 1
, потому что это "несоответствие" ?
Прочитав этот список, я подумал, что могу использовать __cplusplus
для проверки переносимости, если у меня есть компилятор с поддержкой С++ 11. Но с g++ это, похоже, не работает. Я знаю о макросе ...EXPERIMENTAL...
, но мне стало любопытно, почему g++ определяет __cplusplus
таким образом.
Моя первоначальная проблема заключалась в переключении между различными вариантами нулевого указателя. Что-то вроде этого:
#if __cplusplus > 201100L
# define MYNULL nullptr
#else
# define MYNULL NULL
#endif
Есть ли простой и разумно переносимый способ реализовать такой коммутатор?