如何独立于标准启用 GCC 的 GNU 扩展?

Posted

技术标签:

【中文标题】如何独立于标准启用 GCC 的 GNU 扩展?【英文标题】:How to enable GCC's GNU extensions independently of the standard? 【发布时间】: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")

【问题讨论】:

【参考方案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 是对的,它必须是用户定义的开关。但是这条信息也很有用:)

以上是关于如何独立于标准启用 GCC 的 GNU 扩展?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt Creator 中启用自定义 gcc 参数? [复制]

如何修复警告:扩展初始化列表?

关于GNU规范的语法扩展

警告:扩展初始化列表仅适用于 -std=c++11 或 -std=gnu++11 [默认启用]

如何让 GCC 使用不同的标准库?

gcc支持的C语言标准(-std选项)