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

前端 未结 1 609
小蘑菇
小蘑菇 2020-12-07 01:18

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

相关标签:
1条回答
  • 2020-12-07 01:56

    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.

    0 讨论(0)
提交回复
热议问题