Gnu C ++ макрос __cplusplus стандарт соответствует? - PullRequest
31 голосов
/ 23 сентября 2011

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

Существует ли простой и достаточно портативный способ реализовать такой переключатель?

Ответы [ 3 ]

28 голосов
/ 23 сентября 2011

Это было исправлено около месяца назад (для gcc 4.7.0).Отчет об ошибке делает интересное чтение: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773

0 голосов
/ 23 сентября 2011

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

0 голосов
/ 23 сентября 2011

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

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

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

РЕДАКТИРОВАТЬ : о, я вижу из комментария @ birryree, который только что был исправлен, в версии 4.7.0.Таким образом, это не было невозможно исправить в конце концов.Хех.

Ура & hth.

...