配置编译器:选择语言标准

有许多不同版本的 C++ 可用(C++98、C++03、C++11、C++14、C++17、C++20、C++23 等),您的编译器如何知道该使用哪一个吗?一般来说,编译器会选择一个默认标准。通常,默认值不是最新的语言标准——许多默认值是 C++14,它缺少许多最新和最棒的功能。

如果您希望使用不同的语言标准(您可能会这样做),则必须配置您的 IDE/编译器才能执行此操作。

正在进行的语言标准的代号

最终确定的语言标准以最终确定的年份命名(例如,C++17 于 2017 年最终确定)。

然而,当新的语言标准达成一致时,尚不清楚将于哪一年最终确定。因此,正在制定的语言标准被赋予了代号,然后在标准最终确定时被实际名称所取代。例如,C++11在开发时被称为c++1x 。您可能仍然会看到某些地方使用的代号(特别是对于即将推出的语言标准版本,该版本还没有最终名称)。

以下是代号到最终名称的映射:

  • c++1x = C++11
  • c++1y = C++14
  • c++1z = C++17
  • c++2a = C++20
  • c++2b = C++23

例如,如果您看到c++1z,则这与 C++17 语言标准同义。

您应该选择哪种语言标准?

在专业环境中,通常会选择比最新标准低一两个版本的语言标准(例如,如果 C++20 是最新版本,则意味着 C++14 或 C++17)。这样做通常是为了确保编译器制造商有机会解决缺陷,以便更好地理解新功能的最佳实践。在相关的情况下,这还有助于确保更好的跨平台兼容性,因为某些平台上的编译器可能不会立即提供对较新语言标准的完全支持。

对于个人项目和学习来说,选择最新的最终标准(截至撰写本文时,目前为 C++23)几乎没有什么缺点。

在本课程结束时,您可以编译一些测试程序,以查看您是否将编译器设置为正确使用 C++17 或 C++20。

在 Visual Studio 中设置语言标准

Visual Studio 2022 默认使用 C++14 功能,这不允许使用 C++17 和 C++20 中引入的较新功能。要使用这些新功能,您需要启用新的语言标准。

要选择语言标准,请打开您的项目,然后转到“项目”菜单 >(您的应用程序的名称) “属性”,然后打开“配置属性”>“C/C++”>“语言”

配置编译器:选择语言标准

首先,确保配置设置为“所有配置”。您可以将C++ 语言标准设置为您希望使用的 C++ 版本。

在 Code::Blocks 中设置语言标准

Code::Blocks 可能默认为 C++11 之前的语言标准。您肯定需要检查并确保启用更现代的语言标准。

好消息是 Code::Blocks 允许在全球范围内设置语言标准,因此您可以设置一次(而不是每个项目)。为此,请转到“设置”菜单 >“编译器…”

配置编译器:选择语言标准

然后找到标记为have g++ follow the C++XX ISO C++ language standard [-std=c++XX] 的复选框,其中 XX 是代表语言标准的某个数字(例如 20、17 等…):

配置编译器:选择语言标准

如果您在此列表中没有看到 C++17,请升级到 Code::Blocks 的最新版本。

如果由于某种原因无法升级到最新版本,您的 Code::Blocks 版本可能支持即将推出(或刚刚发布)的 C++ 版本。如果是这样,这些将被标记have g++ follow the coming C++XX(又名 C++YY)ISO C++ language standard [-std=c++XX](参见上面的蓝色框)。从此列表中选择最新版本。

截至撰写本文时,当前版本的 Code::Blocks (20.03) 不支持 C++20。如果您想将 C++20 与 Code::Blocks 一起使用:

  1. 通过更新 MinGW 来更新编译器。执行此操作的过程可以 安装集成开发环境 (IDE)中的 Code::Blocks 部分找到。
  2. 在“全局编译器设置”对话框的“其他编译器选项选项卡”中添加以下内容:
-std=c++20

在 g++ 中设定语言标准

对于 GCC/G++,您可以传递编译器标志-std=c++11-std=c++14-std=c++17或 来-std=c++20分别启用 C++11/14/17/20 支持。如果您有 GCC 8 或 9,则需要使用-std=c++2aC++20 支持。

为 VS Code 设置语言标准

对于 VS Code,您可以使用编译器标志"-std=c++11","-std=c++14","-std=c++17","-std=c++20",分别启用 C++11/14/17/20 支持。如果您有 GCC 8 或 9,则需要使用"-std=c++2a",C++20 支持。

将适当的语言标准标志(包括双引号和逗号)放置在tasks.json配置文件中的"args"部分中,在 之前单独一行"${file}"

我们还希望将 Intellisense 配置为使用相同的语言标准。对于 C++20,在 中settings.json,在其自己的行上更改或添加以下设置:"C_Cpp.default.cppStandard": "c++20"

测试编译器的 C++17 兼容性

启用 C++17 语言标准(或更高版本)后,您应该能够编译以下代码,而不会出现任何警告或错误。

#include <array>
#include <iostream>
#include <string_view>
#include <tuple>
#include <type_traits>

namespace a::b::c
{
    inline constexpr std::string_view str{ "hello" };
}

template <class... T>
std::tuple<std::size_t, std::common_type_t<T...>> sum(T... args)
{
    return { sizeof...(T), (args + ...) };
}

int main()
{
    auto [iNumbers, iSum]{ sum(1, 2, 3) };
    std::cout << a::b::c::str << ' ' << iNumbers << ' ' << iSum << '\n';

    std::array arr{ 1, 2, 3 };

    std::cout << std::size(arr) << '\n';

    return 0;
}

如果您无法编译此代码,则说明您尚未启用 C++17,或者您的编译器不完全支持 C++17。在后一种情况下,请安装最新版本的 IDE/编译器。

测试编译器的 C++20 兼容性

启用 C++20 语言标准后,您应该能够编译以下代码,而不会出现任何警告或错误。

#include <array>
#include <iostream>
#include <span>

struct Foo
{
    int a{ };
    int b{ };
    int c{ };
};

consteval int sum(std::span<const int> a) // std::span and consteval
{
    int s{ 0 };
    for (auto n : a)
        s += n;
    return s;
}

auto sum(auto x, auto y) -> decltype(x + y) // abbreviated function templates
{
    return x + y;
}

int main()
{
    constexpr std::array a{ 3, 2, 1 };
    constexpr int s{ sum(a) };
    std::cout << s << '\n';

    Foo f1{ .a = 1, .c = 3 }; // designated initializers
    std::cout << sum(f1.a, f1.c) << '\n';

    return 0;
}

导出您的配置

每次创建新项目时都必须重新选择所有设置选项,这非常繁重。幸运的是,大多数 IDE 都提供了导出设置的方法。这通常是通过使用所需的设置创建新的项目模板,然后在创建新项目时选择该项目模板来完成的。

对于 Visual Studio 用户

在 Visual Studio 中,可以通过“项目”->“导出模板”使用此选项。选择“项目模板”,添加名称和可选描述(例如C++20控制台应用程序),然后单击“完成”。

下次创建新项目时,您将看到该模板显示在项目模板列表中。

使用此模板创建新项目后,它可能无法打开任何文件。您可以通过转到“解决方案”->“<项目名称>”->“源文件”->“<模板名称>.cpp”在“解决方案资源管理器”窗口中打开 .cpp 文件。

对于 Code::Blocks 用户

在 Code::Blocks 中,选择“文件”->“将项目另存为模板”。为您的模板指定标题,然后保存。

当您创建新项目时,您将在“用户模板”选项下找到该模板。

在哪里可以查看 C++ 标准文档?

每个 C++ 语言标准都由标准文档进行描述,标准文档是正式的技术文档,是给定语言标准的规则和要求的权威来源。标准文档不是为学习而设计的,而是为编译器编写者设计的,以便能够准确地实现新的语言标准。您偶尔会看到人们在解释某些内容如何工作时引用标准文档。

给定语言标准的已批准 C++ 标准文档不是免费提供的。这里有一个购买最新标准的链接。

当制定新的语言标准时,标准草案文件会发布以供审查。这些草稿在线免费获取。批准标准之前的最后一个标准草案通常足够接近官方标准,可以用于大多数用途。您可以在此处找到标准草案。

原创文章,作者:jkhxw,如若转载,请注明出处:https://www.jkhxw.com/cpp-compiler-choosing-a-language-standard/

(0)
上一篇 2023年9月28日 下午10:54
下一篇 2023年9月29日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注