Я пытаюсь определить, доступны ли функции C++ 0x при компиляции. Существует ли общий макрос препроцессора? Я использую компилятор Visual Studio 2010 и компилятор Intel.Определить наличие C++ 0x
ответ
Макрос __cplusplus
будет have a value больше 199711L
.
При этом не все компиляторы будут заполнять это значение. Лучше использовать решение Роджера.
У вас есть цитата из проекта, которая гарантирует это? – 2009-12-29 18:24:04
Даже с 'icc -std = C++ 0x', \ _ \ _ cplusplus по-прежнему определяется как 1. – 2009-12-29 18:26:25
Нет, просто сайт Бьярне. Я предполагаю, что он сказал, вероятно, будет в стандарте, хотя я полагаю, что это может быть не так. – GManNickG
Обычный способ сделать это - определить его в системе сборки и передать «конфигурационные макросы», обычно называемые HAS_ *, при компиляции. Например: compiler -DHAS_LAMBDA source.cpp
.
Если вы можете определить это из макроса версии компилятора, вы можете определить эти макросы в заголовке конфигурации, который проверяет это; однако вы не сможете это сделать для чего-либо, управляемого параметром командной строки. Однако ваша система сборки знает, какие параметры вы указали, и можете использовать эту информацию.
См. boost.config для примера и подробностей о конкретных компиляторах, версиях и функциях.
У нас были аналогичные проблемы с nullptr и auto_ptr. Вот что мы пытаемся использовать до тех пор, пока не будет стандартизировано какое-либо соединение:
#include <cstddef>
...
// GCC: compile with -std=c++0x
#if defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 6) || (__GNUC__ >= 5))
# define HACK_GCC_ITS_CPP0X 1
#endif
#if defined(nullptr_t) || (__cplusplus > 199711L) || defined(HACK_GCC_ITS_CPP0X)
# include <memory>
using std::unique_ptr;
# define THE_AUTO_PTR unique_ptr
#else
# include <memory>
using std::auto_ptr;
# define THE_AUTO_PTR auto_ptr
#endif
Он хорошо работает на GCC и Visual Studio от Microsoft. Кстати, nullptr
является ключевым словом и не может быть протестирован - следовательно, причина для теста nullptr_t
.
- 1. Есть _1 часть C++ 0x?
- 2. Как определить наличие определенного устройства
- 3. C++ 0x: память заказа
- 4. template typedef C++ 0x
- 5. Улучшения производительности C++ 0x
- 6. C++ 0x прерывание потока
- 7. C++ 0x назначенные инициализаторы
- 8. Любые реализации C++ 0x?
- 9. C++ 0x Lambda overhead
- 10. C++ 0x threading
- 11. C++ 0x - Когда?
- 12. C++ 0x Списки инициализаторов
- 13. Динамически определить наличие компонента Ember?
- 14. BigQuery - как определить наличие данных
- 15. Определить наличие Javascript из ActionScript?
- 16. Как определить наличие прямой кнопки?
- 17. Включение опций -std = C++ 0x или -std = gnu ++ 0x
- 18. Удаление виртуальных функций в C++ 0x
- 19. Как реализовать строковый литерал C++ 0x?
- 20. асинхронный вызов функции C++ 0x
- 21. Как вернуть fstream (C++ 0x)
- 22. C++ 0x шага конструктор Гоча
- 23. C++ 0x с Qt Creator
- 24. с использованием C++ 0x - безопасно?
- 25. Пример списка инициализаторов C++ 0x
- 26. Наследование Конструкторы в C++ 0x
- 27. Wait in C++ 0x многопоточность
- 28. C++ 0x компилятор поддержка Вопрос
- 29. Компиляция C++ 0x для AVR
- 30. Реализация атомарного шаблона C++ 0x
Я знаю, что это дубликат, я просто не могу его найти. EDIT: Вот это: http://stackoverflow.com/questions/1686348/what-is-defined-if-a-compiler-is-cpp0x-compliant – GManNickG
Спасибо GMAN, но это работает только в том случае, если выполняется полный стандарт (по всей видимости). Intel возвращает 199711, даже если у него есть lambdas – Steve
Особенности C++ 0x в настоящее время нестандартны. Нет стандартного способа указывать на наличие нестандартных функций. Если вы ищете отдельные функции, вам придется сворачивать свои собственные индикаторы в системе сборки. –