Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
338 views
in Technique[技术] by (71.8m points)

c++ - check if a c++11 feature is enabled in compiler with CMAKE

I'm developing a project with CMake. My code contains constexpr methods, that are allowed in Visual Studio 2015, but not in Visual Studio 2013.

How can I check in the CMakeLists.txt if the feature is supported by the specified compiler? I've seen in CMake documentation CMAKE_CXX_KNOWN_FEATURES, but I didn't understand how to use it.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can use target_compile_features to require a C++11(/14/17) feature:

target_compile_features(target PRIVATE|PUBLIC|INTERFACE feature1 [feature2 ...])

With feature1 being a feature listed in CMAKE_CXX_KNOWN_FEATURES. For example, if you want to use constexpr in your public API, you can use:

add_library(foo ...)
target_compile_features(foo PUBLIC cxx_constexpr)

You should also take a look at the WriteCompilerDetectionHeader module which allows to detect features as options, and provides a backward compatibility implementation for some features if the compiler does not support them:

write_compiler_detection_header(
    FILE foo_compiler_detection.h
    PREFIX FOO
    COMPILERS GNU MSVC
    FEATURES cxx_constexpr cxx_nullptr
)

Here a file foo_compiler_detection.h will be generated with FOO_COMPILER_CXX_CONSTEXPR defined if the keyword constexpr is available:

#include "foo_compiler_detection.h"

#if FOO_COMPILER_CXX_CONSTEXPR

// implementation with constexpr available
constexpr int bar = 0;

#else

// implementation with constexpr not available
const int bar = 0;

#endif

Moreover, FOO_CONSTEXPR will be defined and will expand to constexpr if the feature exists for the current compiler. It will be empty otherwise.

FOO_NULLPTR will be defined and will expand to nullptr if the feature exists for the current compiler. It will expand to a compatibility implementation otherwise (e.g. NULL).

#include "foo_compiler_detection.h"

FOO_CONSTEXPR int bar = 0;

void baz(int* p = FOO_NULLPTR);

See CMake documentation.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...