Ответ 1
Это было исправлено около месяца назад (для gcc 4.7.0). Отчет об ошибке делает интересным следующее: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773
Компилятор 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
Есть ли простой и разумно переносимый способ реализовать такой коммутатор?
Это было исправлено около месяца назад (для gcc 4.7.0). Отчет об ошибке делает интересным следующее: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773
Это очень старая ошибка g++.
То есть, компилятор не соответствует.
По-видимому, он не может быть исправлен, потому что его исправление сломает что-то на сумасшедшей платформе.
EDIT: О, я вижу из комментария @birryree, который только что был исправлен, в версии 4.7.0. Поэтому в конце концов, это было невозможно. Хех.
Приветствия и hth.
Если я правильно помню, это связано с Solaris 8, вызывающим проблемы, когда __cplusplus
установлен так, как должен. Команда gcc решила в то время поддерживать платформу Solaris 8, а не соответствовать этому конкретному пункту. Но я заметил, что последняя версия gcc завершает поддержку Solaris 8, и я думаю, что это первый шаг в правильном направлении.