Мне нужно backport nullptr в библиотеку кросс-платформы, которую мы имеем, но у меня возникли проблемы с надежной проверкой поддержки nullptr.Как я могу надежно обнаружить поддержку nullptr?
Изначально у меня было так:
#if __cplusplus >= 201103L || (__cplusplus < 200000 && __cplusplus >= 199711L)
// nullptr should be ok
#else
// Too old
#endif
Но потом я обнаружил, что компиляция программы, которая только распечатывается значение __cplusplus неожиданные результаты.
Одно из опубликованных сообщений в блоге 199711L было значением, которое MS-компиляторы используют для указания частичной поддержки C++ 11. Но я замечаю, что g ++ 5.4 производит это значение по умолчанию. Пока вы прямо не скажете ему использовать компиляцию с -std = C++ 11. Но тогда, если вы скажете, что это стандарт C++ 98, значение 199711 все еще отображается. Это звучит неправильно для меня. Так что это не хорошая проверка!
Затем я увидел someone doing this с ответом, в котором утверждалось, что он может работать. Ну, это не так.
#if !defined(nullptr)
#endif
Но я не уверен, что вы можете это сделать. Поэтому я протестировал это следующим образом:
#if defined(nullptr)
#error "null ptr defined"
#endif
Угадайте, что? который не печатает ошибку, когда nullptr фактически доступен. Так что это совсем не так.
Как определить версию nullptr или компилятора под linux/windows и OSX (clang)/android.
Если он недоступен, код, который его использует, не будет компилироваться. Это кажется мне довольно простым показателем. И почему, по-вашему, вам нужно (или может) «вернуть» его? –
Посмотрите на макрос Boost.Config 'BOOST_NO_CXX11_NULLPTR'. Либо используйте Boost.Config, либо дублируйте эквивалентную логику, которую они используют, чтобы определить это. – GManNickG
@ Можете ли вы попробовать проверку typetrait на nullptr_t? sth, как std :: is_same или sth, как это. –