【问题标题】:How to include <numbers> header file and use std::numbers如何包含 <numbers> 头文件并使用 std::numbers
【发布时间】:2021-11-25 06:57:48
【问题描述】:

在 11.1.0 版的 gcc 和 g++ 上运行。每次我运行这段代码时都会遇到问题,它说 std::numbers 没有声明。我尝试在我的终端中运行g++ randomCodeWhileReading.cpp -o main-std=c++20(我正在运行 ubuntu linux),但仍然没有任何变化。这是有问题的代码:

#include <iostream>
#include <numbers>
int main()
{
    const long double pi {0};
    const long double pi2 {0};

    pi  = std::numbers::pi_v<long double>;
    pi2 = std::numbers::pi_v<long double>;

    std::cout << pi << std::endl << pi2;

}

只是想看看数字模块的实际运行情况。 (它甚至被称为模块还是头文件?)

21 年 10 月 6 日编辑: 修改常量变量已得到修复。但是,此代码仍然无法在我的计算机上运行。也就是说,#include &lt;numbers&gt; 似乎在我的机器上不起作用,即使使用-std=c++20 也会引发错误。我正在运行 gcc 和 g++ 版本 11.1 请参阅以下错误:

gcc ex2_03.cpp -o -std=c++20
ex2_03.cpp: In function ‘int main()’:
ex2_03.cpp:22:65: error: ‘std::numbers’ has not been declared
   22 |     const double pond_diameter {2.0 * std::sqrt(pond_area/ std::numbers::pi)}; //find diameter by finding radius & multiplying by 2
      |    

但是我无法使用godbolt.org 进行复制(类似的程序不一样,但也可以使用)。显然,这似乎是我的机器的问题。我该如何解决这个问题?

21 年 10 月 8 日编辑: 我使用更多标志再次运行代码并将 -std=c++20 更改为 -std=c++2a 这就是返回的内容:

chris@chris-Aspire-E5-576G:~/Desktop/programming/c++/Learning$ ls
ex2_02      HelloWorld          randomCodeWhileReading      textbookExample1
ex2_02.cpp  HelloWorld.cpp      randomCodeWhileReading.cpp  textbookExample1.cpp
ex2_02.o    HelloWorld.o        randomCodeWhileReading.o    textbookExample1.o
ex2_03      main                textbookDebug               textbookOutputNameAndAge.cpp
ex2_03.cpp  outputNameAndAge    textbookDebug.cpp
ex2_03.o    outputNameAndAge.o  textbookDebug.o
chris@chris-Aspire-E5-576G:~/Desktop/programming/c++/Learning$ g++ -g -Wall -pedantic -std=c++2a -o randomCodeWhileReading.cpp
g++: fatal error: no input files
compilation terminated.

添加了 ls 输出以显示我在正确的目录中。

编辑 10/8/21 v2: 我使用了以下命令,没有收到错误。

g++ randomCodeWhileReading.cpp -o main -std=c++20

现在只是混淆了输出的去向。根据@nate 的回复,我认为它已发送到 main?只是想看看使用std::numbers::pi的cout

编辑 10/8/21 v3: 使用./main可以运行所有清晰的nate解释程序

编辑 10/8/21 v4: ...我重复了之前的命令并得到了一个错误:

g++ randomCodeWhileReading.cpp -o main -std=c++20
cc1plus: fatal error: randomCodeWhileReading.cpp: No such file or directory
compilation terminated.

有人能解释一下这次出了什么问题吗? (我还在同一个目录中)。使用ls之后好像文件已经不在目录下好像被删除了?

编辑 10/8/21 v5: 我认为当我向朋友解释错误以及我运行命令的错误方式时,该文件被删除了大声笑。一切都好:D!

【问题讨论】:

  • -o main-std=c++20 之间应该有一个空格。这真的是你的命令行,还是抄错了?
  • 这里工作正常(删除const后):godbolt.org/z/65obeK4MP
  • 这个问题是重复的:How to reinstall gcc and g++ on ubuntu linux,我们仍然需要知道 1) EXACT 错误(复制/粘贴 ACTUAL 文本消息 - 不要给我们“摘要”!),2 ) 你的 g++ 版本,3) 你的 EXACT g++ 命令行。看看你的帖子:你在上面一起运行了“main-std=c++20”。那是错字吗?还是您的实际命令?请Edit您的帖子并提供此信息。
  • 不,你的命令行还是错的。 -o 之后的下一个参数始终被视为输出文件(可执行文件)的名称,而不是作为选项。使用您的原始命令,它将输出写入名为 main-std=c++20 的文件,而不是将 -std=c++20 作为选项。使用您的新命令,它会将输出写入名为-std=c++20 的文件,但仍不将其视为选项。如果你检查你的目录,你会看到很多奇怪命名的文件。试试g++ ex2_03.cpp -o main -std=c++20。粘贴它,包括所有空格。
  • @ExZerminator: 1) 感谢您更新您的帖子。拥有确切的信息对于解决问题至关重要。2) 我无法重现 .... 因为我手边没有 g++ 10 或 11 编译器。我现在正在安装一个。 3) 请不要急于下结论“您的安装有问题”。 4) 请务必修复您的命令行(根据 Nate Eldredge)和Edit 您的帖子以及结果。

标签: c++ gcc g++ codeblocks c++20


【解决方案1】:

您需要使用额外的标志-std=c++20进行编译。

此外,您的代码中存在错误:pipi2 被声明为 const,因此您无法在它们初始化后修改它们。改用这个:

#include <iostream>
#include <numbers>

int main()
{
    const long double pi = std::numbers::pi_v<long double>;
    const long double pi2 = std::numbers::pi_v<long double>;
    std::cout << pi << std::endl << pi2;
}

【讨论】:

  • 如帖子中所述,我在编译时尝试了 -std=c++20 标志,但仍然说 std::numbers 未声明。教科书说这是一个模块 & 使用 import ;但这根本行不通。感谢关于 const 修改的建议没有看到。
  • @ExZerminator cannot reproduce
  • 查看编辑。无法重现似乎是我机器上的一个问题。有什么建议可以解决这个问题?
  • @ExZerminator:这不太可能是“您的机器上的问题”。我很高兴您复制/粘贴了版本信息、确切的错误消息和命令行。现在请修复你的命令行(根据上面 Nate Eldredge 的最新评论),并Edit你的帖子再次说明发生了什么。
【解决方案2】:

请在您的机器上使用您的 g++ 版本尝试此代码和此“编译”命令:

/* 
 * TEST ENVIRONMENT: MSYS2 (Windows 10)
 * COMPILER: 
 *   g++ --version
 *   g++.exe (Rev5, Built by MSYS2 project) 10.3.0
 * BUILD COMMAND: 
 *   g++ -g -Wall -pedantic -std=c++2a -o x x.cpp
 *   <= NOTE: the correct command for C++ 20 compatibility in g++ 10.x is "-std=c++2a"
 * RUN COMMAND:
 *   ./x
 *   2pi=6.28319
 */
#include <iostream>
#include <numbers>

int main()
{
    auto two_pi = 2*std::numbers::pi;
    std::cout << "2pi=" << two_pi << '\n';
}

如果它有效,那就太好了。如果相同,请尝试“-std=c++20”和/或“-std=gnu++20”。详情看这里:https://gcc.gnu.org/projects/cxx-status.html

另见:

绝对“更新”您的帖子以报告发生的情况。请务必准确复制/粘贴您的命令和任何错误消息。

'希望有帮助。

【讨论】:

  • 我正在运行 ubuntu linux。我运行了显示的命令,它返回“无输入文件”(我在正确的目录中)。我将使用准确的输入和错误消息编辑帖子
  • 回答您在 cmets 中提出的其他问题:我可以通过代码块很好地运行非 c++20 功能,但通过命令行显示文件不存在
  • no input files 是一个错字:您忘记了输出文件名。 it says file doesn't exist 太模糊了——这可能意味着几个完全不同的事情。问:如果您只是简单地键入命令(使用-o SOMEFILE 从终端窗口(没有代码块,没有 Godbolt:只有 g++)会发生什么?请再次Edit 您的帖子,a)复制/粘贴命令,b ) 复制/粘贴错误。就像您对“无输入文件”错误所做的那样。
  • 是的,我在乱写东西,把事情搞砸了。我现在明白它的 g++ 文件名 -o 输出文件名 -std=c++20.它运行良好,只是第二次出错了,因为我以不同的顺序运行语句,显示我的朋友不该做什么,哈哈。
  • 好的:一切正常,对吗?请“投票”这个和 francesco 的答案,并请“接受”其中一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 2021-11-05
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多