【问题标题】:How to enable GCC's GNU extensions independently of the standard?如何独立于标准启用 GCC 的 GNU 扩展?
【发布时间】:2013-09-13 13:34:10
【问题描述】:

我想将 C++98 / C++11 切换添加到基于 cmake 的构建系统。由于某些跨平台相关的原因,它已经有另一个开关,即:

if (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++98")
else()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++98")
endif()

所以,要添加 C++11,我必须添加一个类似的子句,但由于代码重复,我不喜欢它。真的不可能独立于标准启用扩展吗?比如:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=${STANDARD_FLAG} ${EXTENSION_FLAGS}")

【问题讨论】:

    标签: c++ gcc c++11 cmake


    【解决方案1】:

    你可以这样做:

    if(USE_CXX_11)
      set(CXX_VERSION 11)
    else()
      set(CXX_VERSION 98)
    endif()
    
    if(USE_GNU_EXTENSIONS)
      set(CXX_DIALECT gnu)
    else()
      set(CXX_DIALECT c)
    endif()
    
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=${CXX_DIALECT}++${CXX_VERSION}")
    

    【讨论】:

      【解决方案2】:

      为什么不直接使用CheckCXXCompilerFlag module

      可以作为

      include(CheckCXXCompilerFlag)
      
      check_cxx_compiler_flag(-std=gnu++11  HAS_FLAG_STD_GNUCXX11)
      
      if(NOT HAS_FLAG_STD_GNUCXX11)
          check_cxx_compiler_flag(-std=c++11    HAS_FLAG_STD_CXX11)
      endif()
      
      if(HAS_FLAG_STD_GNUCXX11)
          set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
      endif()
      
      if(HAS_FLAG_STD_CXX11)
          set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
      endif()
      

      【讨论】:

      • 可能是因为是否使用 C++11 取决于编译器对标志的支持以外的其他因素。也就是说,如果 11 不可用,这对于必须回退到 98 的情况很有用。
      • Mike 是对的,它必须是用户定义的开关。但是这条信息也很有用:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多