如何使用C++的Expect运算符?

14

我正在使用C++开始一个项目,除了一些学校项目外,我以前没有在此之外使用过——这些项目远远没有我现在要处理的范围那么大。

我的目标是尽力遵循C++核心指南,以避免错误、提高性能和最重要的是:改善代码的可维护性。

我遇到了数百个问题,从我的g++ / Clang++版本不正确到无法找到标准库,再到g++使用错误的C++版本进行编译,甚至到一些基本函数的行为与预期不符——而我甚至还没开始研究autotools,因此我预计会有更多的头痛随之而来。

但这个问题只涉及C++核心指南的一个部分。 接口6:倾向于使用Expects()表达先决条件

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

#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来获取GSL吗? - stevendesu
与您的问题无关,但更现代的构建生成器可能是一个好主意。我更喜欢Meson,但CMake是事实上的标准。任何一个都可以帮助解决iostream问题,因为它们会找到所有正常的东西。 - Michael Surette
我现在正在学习CMake。我绝对需要一个更好的构建系统。我对C++开发还比较新,所以我正在重新学习我用JavaScript和Python花了几年时间才弄明白的所有东西(有哪些构建工具、依赖管理器存在,人们如何组织项目等)。 - stevendesu
2个回答

12

3
阅读关于如何正确使用C++的“指南”,却发现其中有一些非标准的建议,这确实很奇怪。 - Daniel Daranas
1
请注意,链接现在是 https://github.com/microsoft/GSL/blob/main/include/gsl/assert。gsl/gsl_assert已被弃用。 - Robert Bernstein
1
@RobertBernstein 谢谢。我已经删除了建议,以避免混淆。 - Mário Feroldi

2

C++20是什么?我以为版本号的最后两位数字代表发布年份(例如,C++14在2014年发布,C++17在2017年发布等),这不意味着C++20将在2020年发布吗?现在才2019年。我是否误解了命名规则?另外,我该如何安装和使用C++20?当我尝试g++ -std=c++20时,它会出现错误did you mean -std=c++03? - stevendesu
5
C++20仍处于标准化阶段。他们可能指的是C++2a,这是即将到来的C++20的占位符。 - Mário Feroldi
1
@MárioFeroldi:除了编译器开关之外,没有人称其为“C++2a”,而且仅在这种情况下才表达它还不是完整的C++20实现。 - Nicol Bolas
3
提案已从C++ 2020中删除,请参见https://www.reddit.com/r/cpp/comments/cmk7ek/what_happened_to_c20_contracts/。 - Jules Sam. Randolph
@stevendesu 从2011年开始,每隔3年就会推出一次新的C++修订版。在进行下一次修订的过程中,参与者们会进行大量的讨论和实验,直到最终确定修订内容,并达成一致意见,以决定如何实现特定功能。"合约"是其中一个经过十多年实验的关键部分。 - Marco Kinski
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接