Steve
Steve

Reputation: 12004

Determine C++0x availability

I'm trying to determine if C++0x features are available when compiling. Is there a common preprocessor macro? I'm using Visual Studio 2010's compiler and Intel's compiler.

Upvotes: 2

Views: 1807

Answers (3)

jww
jww

Reputation: 102205

We've had similar problems with nullptr and auto_ptr. Here's what we're trying to use until somehing is standardized:

#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

It works well on GCC and Microsoft's Visual Studio. By the way, nullptr is a keyword and can't be tested - hence the reason for the nullptr_t test.

Upvotes: 2

Roger Pate
Roger Pate

Reputation:

The usual way to do this is determine it in the build system, and pass "configuration macros", commonly named HAS_*, when compiling. For example: compiler -DHAS_LAMBDA source.cpp.

If you can determine this from compiler version macro, then you can define these macros in a configuration header which checks that; however, you won't be able to do this for anything controlled by a command-line option. Your build system does know what options you specify, however, and can use that info.

See boost.config for a real example and lots of details about specific compilers, versions, and features.

Upvotes: 3

GManNickG
GManNickG

Reputation: 503765

The macro __cplusplus will have a value greater than 199711L.

That said, not all compilers will fill this value out. Better to use Roger's solution.

Upvotes: 4

Related Questions