2009-12-29 2 views
2

Я пытаюсь определить, доступны ли функции C++ 0x при компиляции. Существует ли общий макрос препроцессора? Я использую компилятор Visual Studio 2010 и компилятор Intel.Определить наличие C++ 0x

+1

Я знаю, что это дубликат, я просто не могу его найти. EDIT: Вот это: http://stackoverflow.com/questions/1686348/what-is-defined-if-a-compiler-is-cpp0x-compliant – GManNickG

+0

Спасибо GMAN, но это работает только в том случае, если выполняется полный стандарт (по всей видимости). Intel возвращает 199711, даже если у него есть lambdas – Steve

+2

Особенности C++ 0x в настоящее время нестандартны. Нет стандартного способа указывать на наличие нестандартных функций. Если вы ищете отдельные функции, вам придется сворачивать свои собственные индикаторы в системе сборки. –

ответ

4

Макрос __cplusplus будет have a value больше 199711L.

При этом не все компиляторы будут заполнять это значение. Лучше использовать решение Роджера.

+0

У вас есть цитата из проекта, которая гарантирует это? – 2009-12-29 18:24:04

+0

Даже с 'icc -std = C++ 0x', \ _ \ _ cplusplus по-прежнему определяется как 1. – 2009-12-29 18:26:25

+2

Нет, просто сайт Бьярне. Я предполагаю, что он сказал, вероятно, будет в стандарте, хотя я полагаю, что это может быть не так. – GManNickG

3

Обычный способ сделать это - определить его в системе сборки и передать «конфигурационные макросы», обычно называемые HAS_ *, при компиляции. Например: compiler -DHAS_LAMBDA source.cpp.

Если вы можете определить это из макроса версии компилятора, вы можете определить эти макросы в заголовке конфигурации, который проверяет это; однако вы не сможете это сделать для чего-либо, управляемого параметром командной строки. Однако ваша система сборки знает, какие параметры вы указали, и можете использовать эту информацию.

См. boost.config для примера и подробностей о конкретных компиляторах, версиях и функциях.

2

У нас были аналогичные проблемы с 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.

Смежные вопросы