@Mat: поставлен и закрыт, потому что вопрос был вздором и содержал какую-то другую произвольную чепуху. Перепостил в достойном виде. Я был бы счастлив закрыть это, если кажется, что оригинал будет исправлен и возрожден, но я не задерживаю дыхание.
Гонки за легкостью на орбите,
1
@Mat: Что ж, лучший ответ - это не статический список компиляторов, а средство определения для себя, что используется. Итак, поехали.
Гонки легкости на орбите
1
@Als: Скоро будет. Обещаю. Кроме того, у c++-faqтега нет какого-либо фактического необходимого «количества запросов», которое вы должны передать; это больше о формате и общности вещи.
Гонки легкости на орбите,
Ответы:
13
Насколько мне известно, универсального способа сделать это не существует. Если вы посмотрите на заголовки межплатформенных / нескольких поддерживающих компиляторов библиотек, вы всегда найдете множество определений, которые используют специфические конструкции компилятора для определения таких вещей:
/*Define Microsoft Visual C++ .NET (32-bit) compiler */#if (defined(_M_IX86) && defined(_MSC_VER) && (_MSC_VER >= 1300)...#endif/*Define Borland 5.0 C++ (16-bit) compiler */#if defined(__BORLANDC__) && !defined(__WIN32__)...#endif
Вам, вероятно, придется самостоятельно определять такие определения для всех используемых вами компиляторов.
В C ++ 0x макросу __cplusplusбудет присвоено значение, которое отличается от текущего (больше) 199711L.
Хотя это не так полезно, как хотелось бы. gcc(по всей видимости, почти 10 лет) это значение было установлено равным 1, исключая один из основных компиляторов, пока оно не было исправлено, когда вышел gcc 4.7.0 .
Это стандарты C ++ и то, что вы можете ожидать от них __cplusplus:
C ++ до C ++ 98: __cplusplusесть 1.
C ++ 98: __cplusplusесть 199711L.
C ++ 98 + TR1: читается как C ++ 98, и я не знаю, как это проверить.
C ++ 11: __cplusplusесть 201103L.
C ++ 14: __cplusplusесть 201402L.
C ++ 17: __cplusplusесть 201703L.
Если компилятор может быть более gccранним, нам нужно прибегнуть к конкретным хакерским действиям компилятора (посмотрите на макрос версии, сравните его с таблицей с реализованными функциями) или используйте Boost.Config (который предоставляет соответствующие макросы ). Преимущество этого состоит в том, что мы действительно можем выбрать конкретные функции нового стандарта и написать обходной путь, если эта функция отсутствует. Это часто предпочтительнее оптового решения, поскольку некоторые компиляторы утверждают, что реализуют C ++ 11, но предлагают только подмножество функций.
К сожалению, более детальная проверка функций (например, отдельных библиотечных функций std::copy_if) может быть выполнена только в системе сборки вашего приложения (запустите код с функцией, проверьте, скомпилирован ли он и дает ли правильные результаты - autoconfэто инструмент выбора, если вы выбираете этот маршрут).
Не похоже, что поставщики компиляторов обновляют это - может быть, они ждут, пока они полностью не будут соответствовать стандарту? ( Stackoverflow.com/q/14131454/11698 )
Ричард Корден,
2
@prnr: Возможно, это правда, но пользователь, задавший вопрос, должен решить, какой ответ принять. На тот момент, когда был опубликован ответ, который в настоящее время отмечен как принятый, он был правильным, поэтому исходный постер принял его. Этот пользователь может решить изменить принятый ответ, но он больше не будет активен на сайте. См .: meta.stackexchange.com/questions/120568/…
Это забавно, потому что в визуальных студиях значение __cplusplus - 199711L, а опубликованный вами код вернул C ++ 98, однако я использовал функции из C ++ 14, включая шаблоны переменных и decltype (auto). Возможно, была реализована неправильная версия макроса?
@DaanTimmer Меня смущает эта статья, кажется, предполагается, что я знаю, как использовать /Zc:__cplusplusфлаг. Я не могу просто std::cout << /Zc:__cplusplus;потому, что двоеточия и косые черты, конечно же, не могут быть частью имен переменных. Вы можете объяснить, как это сделать? Спасибо.
В зависимости от того, чего вы хотите достичь, Boost.Config может вам помочь. Он не обеспечивает обнаружение стандартной версии, но предоставляет макросы, которые позволяют вам проверять поддержку определенного языка / функций компилятора.
В любом случае проверка функций, вероятно, лучше, чем проверка стандартных версий. Немногие компиляторы поддерживают все, начиная со стандарта, но если все они поддерживают ограниченное количество необходимых вам функций, то на самом деле не имеет значения, реализованы ли и правильно ли работают остальные функции из данного стандарта.
Роб Кеннеди,
4
__cplusplus
В C ++ 0x макросу __cplusplus будет присвоено значение, которое отличается (больше) от текущего 199711L.
Используйте __cplusplusкак предложено. Только одно замечание для компилятора Microsoft: используйте Zc:__cplusplusпереключатель компилятора для включения__cplusplus
__STDC__Определение того, определено ли и каково его значение, определяется реализацией в C ++.
Роб Кеннеди,
@ Роб: Да, это так. @Tor: Я пробовал использовать VC ++ 2005, но там сказано, что STDC - необъявленный идентификатор. Однако он указан как один из тех предопределенных макросов. Однако STDC_VERSION не существует.
jasonline
Это сообщает вам версию языка программирования C, поддерживаемую компилятором. Он ничего не говорит вам о поддерживаемой версии языка C ++.
Дэн Молдинг
0
Обычно вы должны использовать __cplusplusопределение для обнаружения c ++ 17, но по умолчанию компилятор Microsoft не определяет этот макрос должным образом, см. Https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ - вам нужно чтобы либо изменить настройки проекта, чтобы включить /Zc:__cplusplusпереключатель, либо вы можете использовать такой синтаксис:
c++-faq
тега нет какого-либо фактического необходимого «количества запросов», которое вы должны передать; это больше о формате и общности вещи.Ответы:
Насколько мне известно, универсального способа сделать это не существует. Если вы посмотрите на заголовки межплатформенных / нескольких поддерживающих компиляторов библиотек, вы всегда найдете множество определений, которые используют специфические конструкции компилятора для определения таких вещей:
Вам, вероятно, придется самостоятельно определять такие определения для всех используемых вами компиляторов.
источник
Из FAQ Бьярна Страуструпа C ++ 0x :
Хотя это не так полезно, как хотелось бы.
gcc
(по всей видимости, почти 10 лет) это значение было установлено равным1
, исключая один из основных компиляторов, пока оно не было исправлено, когда вышел gcc 4.7.0 .Это стандарты C ++ и то, что вы можете ожидать от них
__cplusplus
:__cplusplus
есть1
.__cplusplus
есть199711L
.__cplusplus
есть201103L
.__cplusplus
есть201402L
.__cplusplus
есть201703L
.Если компилятор может быть более
gcc
ранним, нам нужно прибегнуть к конкретным хакерским действиям компилятора (посмотрите на макрос версии, сравните его с таблицей с реализованными функциями) или используйте Boost.Config (который предоставляет соответствующие макросы ). Преимущество этого состоит в том, что мы действительно можем выбрать конкретные функции нового стандарта и написать обходной путь, если эта функция отсутствует. Это часто предпочтительнее оптового решения, поскольку некоторые компиляторы утверждают, что реализуют C ++ 11, но предлагают только подмножество функций.Stdcxx Wiki содержит исчерпывающую матрицу для поддержки компилятором функций C ++ 0x (если вы осмеливаетесь проверить эти функции самостоятельно).
К сожалению, более детальная проверка функций (например, отдельных библиотечных функций
std::copy_if
) может быть выполнена только в системе сборки вашего приложения (запустите код с функцией, проверьте, скомпилирован ли он и дает ли правильные результаты -autoconf
это инструмент выбора, если вы выбираете этот маршрут).источник
__cplusplus
только в VS 15.7. См. Их блог команды разработчиков Visual C ++Пожалуйста, запустите следующий код, чтобы проверить версию.
источник
/Zc:__cplusplus
)/Zc:__cplusplus
флаг. Я не могу простоstd::cout << /Zc:__cplusplus;
потому, что двоеточия и косые черты, конечно же, не могут быть частью имен переменных. Вы можете объяснить, как это сделать? Спасибо.В зависимости от того, чего вы хотите достичь, Boost.Config может вам помочь. Он не обеспечивает обнаружение стандартной версии, но предоставляет макросы, которые позволяют вам проверять поддержку определенного языка / функций компилятора.
источник
C ++ 0x FAQ от BS
источник
Используйте
__cplusplus
как предложено. Только одно замечание для компилятора Microsoft: используйтеZc:__cplusplus
переключатель компилятора для включения__cplusplus
Источник https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
источник
После быстрого поиска в Google :
__STDC__
и__STDC_VERSION__
смотрите здесьисточник
__STDC__
Определение того, определено ли и каково его значение, определяется реализацией в C ++.Обычно вы должны использовать
__cplusplus
определение для обнаружения c ++ 17, но по умолчанию компилятор Microsoft не определяет этот макрос должным образом, см. Https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ - вам нужно чтобы либо изменить настройки проекта, чтобы включить/Zc:__cplusplus
переключатель, либо вы можете использовать такой синтаксис:источник