c++ - 如何在 cmake 中通过 g++ 编译器查找默认支持的 C++ 标准
问题描述
我看到了很多关于如何启用某些 C++ 标准的线程,例如
add_definitions("-std=c++14")
和
set (CMAKE_CXX_STANDARD 11)
但是如何在编译代码时找到默认的 g++ 编译器遵循哪个标准?
解决方案
如果您正在开发应用程序,则不应根据可用的编译器版本调整代码,而应指定代码所需的编译器标准:
set (CMAKE_CXX_STANDARD 11)
如果您正在构建一个旨在用于不同上下文的代码库,请使用编译器功能检测和条件编译。例如:
write_compiler_detection_header(
FILE "${CMAKE_CURRENT_BINARY_DIR}/compiler_features.h"
PREFIX Foo
COMPILERS GNU
FEATURES
cxx_variadic_templates
)
接着:
#include "compiler_features.h"
#if Foo_COMPILER_CXX_VARIADIC_TEMPLATES
# include "with_variadics/interface.h"
#else
# include "no_variadics/interface.h"
#endif
这对于像 MSVC 这样的编译器特别有用,它们具有 C++17 的许多特性,同时也缺乏 C++11 的一些基本特性(例如表达式 SFINAE)。
CMake为许多流行的 C++ 功能内置了检测器。
PS。如果你真的很好奇,G++ 到 5.0 默认使用gnu++98
标准,从 6.0 开始gnu++14
(GNU 方言 -std=c++14)。
推荐阅读
- c++ - 为什么我不能在 GtkBuilder 中使用 GtkSourceView,通过 Glade 加载文件?
- java - 如何使用预签名 URL 将文件上传到 S3 而不将其加载到内存中
- html - Using css columns for image grid, sometimes images stack
- nativescript - 如何在 NativeScript 中停靠底部面板
- shopify - Shopify 应用程序在商店中创建实际的东西
- c - 无法破译我的老师的伪代码
- reactjs - 成功 Auth0 登录尝试后重定向问题
- reactjs - 如何从需要使用 react-dates 设置状态的函数的子组件设置状态?
- excel - Excel公式计算两个日期列之间的差异
- google-cloud-platform - 无法构建容器优化操作系统 | sed: -e 表达式 #2, char 60: `s' 的未知选项