Из FAQ Бьярна Страуструпа C ++ 0x :
__cplusplus
В 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, но предлагают только подмножество функций.
Stdcxx Wiki содержит исчерпывающую матрицу для поддержки компилятором функций C ++ 0x (если вы осмеливаетесь проверить эти функции самостоятельно).
К сожалению, более детальная проверка функций (например, отдельных библиотечных функций std::copy_if) может быть выполнена только в системе сборки вашего приложения (запустите код с функцией, проверьте, скомпилирован ли он и дает ли правильные результаты - autoconfэто инструмент выбора, если вы выбираете этот маршрут).