【问题标题】:How to use C++ Expects operator?如何使用 C++ Expects 运算符?
【发布时间】:2019-06-28 11:39:01
【问题描述】:

我正在使用 C++ 开始一个项目,在少数学校项目之外我之前没有使用过 - 远不及我现在要处理的范围。

我的目标是尽最大努力遵循C++ Core Guidelines,因为我努力避免错误、提高性能,最重要的是:提高代码的可维护性。

我遇到了字面上数百的问题,从我的 g++ / Clang++ 版本不正确到标准库未找到到 g++ 使用错误版本的 C++ 进行编译到非常基本的功能表现不如预期 - 而且我什至还没有开始研究自动工具,所以我预计会有更多令人头疼的问题。

不过,这个问题只针对 C++ 核心指南的一部分。 Interfaces 6: Prefer Expects() for expressing preconditions

我尝试编写以下简单代码:

#include <iostream>

using namespace std;

int square(int x) {
    Expects(x > 0);
    return x * x;
}

int main() {
    cout << square(3) << endl;
    return 0;
}

这在 g++ 中引发了错误:

$> g++ -std=c++17 main.cpp
main.cpp: In function ‘int square(int)’:
main.cpp:7:2: error: ‘Expects’ was not declared in this scope
  Expects(x > 0);
  ^~~~~~~
-> [1]

我也尝试过使用 Clang,但它有一个完全不同(且不相关)的问题:

$> clang++ -x c++ main.cpp
main.cpp:1:10: fatal error: 'iostream' file not found
#include <iostream>
         ^~~~~~~~~~
1 error generated.
-> [1]

我还没有想出如何解决这个问题,所以我不打扰它。

【问题讨论】:

  • @Galk 没有这样的文件或目录。我需要sudo apt-get install 来获取 GSL 的东西吗?
  • 与您的问题无关,但更现代的构建生成器可能是个好主意。我更喜欢 Meson,但 CMake 是事实上的标准。两者都可以帮助您解决 iostream 问题,因为它们会找到所有正常的东西。
  • 我现在实际上正在阅读 CMake。我绝对需要一个更好的构建系统。我对 C++ 开发还很陌生,所以我正在重新学习我多年来使用 JavaScript 和 Python 搞清楚的所有内容(存在哪些构建工具、存在哪些依赖项管理器、人们如何构建项目等)

标签: c++ c++17 cpp-core-guidelines


【解决方案1】:

Expects 是 GSL 库的一部分。你必须使用一些 GSL 库实现,你可以在 Github 上找到:

这些都是我想不到的。

如果您只需要合同部分(ExpectsEnsures 等),只需包含 gsl/gsl_assert 标头即可。例如:gsl_assert from Microsoft。 Martin 的实现没有做分离,所以你必须包含entire GSL header

CPP 指南可能提到the "contracts" proposal,它通过属性提供相同的检查。它原计划用于 C++20,但后来由于对其范围缺乏共识而被删除。请参阅p1823r0 和标准委员会成员的Reddit thread,了解导致删除的理由。

【讨论】:

    【解决方案2】:

    除了 GSL,Excepts 也存在于 C++20 中,而不是 C++17 中,语法略有不同

    【讨论】:

    • C++20 是怎么回事?我认为最后两位数字指的是版本发布的年份(例如,C++14 于 2014 年发布,C++17 于 2017 年发布,等等)——这是否意味着 C++20 于 2020 年发布?这只是 2019 年。我误解了命名约定吗?另外,我将如何安装和使用C++20?当我尝试g++ -std=c++20 时,它给出了错误did you mean -std=c++03?
    • C++20 仍处于标准化阶段。他们可能指的是 C++2a,它是即将到来的 C++20 的占位符。
    • 不幸的是 g++ -std=c++2a 给了我同样的错误 :( 我想我现在会坚持使用 GSL 的 C++17
    • @MárioFeroldi:除了编译器开关之外,没有人称它为“C++2a”,然后才表示它还不是一个完整的 C++20 实现。
    • 该提案已从 C++ 2020 中删除,请参阅 reddit.com/r/cpp/comments/cmk7ek/what_happened_to_c20_contracts
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 2012-11-05
    • 2010-12-13
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多