Подтвердить что ты не робот

Gnu С++ macro __cplusplus стандарт соответствует?

Компилятор 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

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

4b9b3361

Ответ 2

Это очень старая ошибка g++.

То есть, компилятор не соответствует.

По-видимому, он не может быть исправлен, потому что его исправление сломает что-то на сумасшедшей платформе.

EDIT: О, я вижу из комментария @birryree, который только что был исправлен, в версии 4.7.0. Поэтому в конце концов, это было невозможно. Хех.

Приветствия и hth.

Ответ 3

Если я правильно помню, это связано с Solaris 8, вызывающим проблемы, когда __cplusplus установлен так, как должен. Команда gcc решила в то время поддерживать платформу Solaris 8, а не соответствовать этому конкретному пункту. Но я заметил, что последняя версия gcc завершает поддержку Solaris 8, и я думаю, что это первый шаг в правильном направлении.