【问题标题】:g++ std=c++98 doesn't compile in MinGWg++ std=c++98 不能在 MinGW 中编译
【发布时间】:2022-01-11 13:49:21
【问题描述】:

这是我的代码:

main.cpp

#include <iostream>
#include <cmath>
using namespace std;
    
int main()
{
    cout << pow(4, 3);
    cin.get();      
}

所以基本上我尝试使用命令g++ main.cpp -std=c++98进行编译

这是我得到的:

    C:\Users\NullPointerException\Desktop\cpp>g++ main.cpp -std=c++98
    In file included from c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\bits\postypes.h:40,
                     from c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\iosfwd:40,
                     from c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\ios:38,
                     from c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\ostream:38,
                     from c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\iostream:39,
                     from main.cpp:1:
    c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\cwchar:166:11: error: '::vfwscanf' has not been declared
      166 |   using ::vfwscanf;
          |           ^~~~~~~~
    c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\cwchar:172:11: error: '::vswscanf' has not been declared
      172 |   using ::vswscanf;
          |           ^~~~~~~~
    c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\cwchar:176:11: error: '::vwscanf' has not been declared
      176 |   using ::vwscanf;
          |           ^~~~~~~
    c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\cwchar:193:11: error: '::wcstof' has not been declared
      193 |   using ::wcstof;
          |           ^~~~~~
    In file included from c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\bits\locale_facets.h:39,
                     from c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\bits\basic_ios.h:37,
                     from c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\ios:44,
                     from c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\ostream:38,
                     from c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\iostream:39,
                     from main.cpp:1:
    c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\cwctype:89:11: error: '::iswblank' has not been declared
       89 |   using ::iswblank;
          |           ^~~~~~~~

基本上我想测试 c++ 是否可以推断pow 的类型。但我得到了这些错误。有什么问题,我该如何解决?

g++ 版本:9.2.0

【问题讨论】:

  • 总结下面的讨论,我看到了两个选择: 1. 切换到更新的 C++(几乎没有任何理由在 2021 年的这个旧 C++ 版本中编码/学习)。 2. 切换到其他编译器/IDE(我知道 Visual Studio 或带有 libc 的 clang,例如,这可能会工作 packages.msys2.org/package/mingw-w64-clang-aarch64-gcc-libs

标签: c++ g++ mingw


【解决方案1】:

我可以在 ubuntu 上使用 g++ 9.3 毫无问题地编译它。似乎您遇到了特定于 g++ mingw32 变体的错误。 您可以尝试在其他包含之前添加include &lt;cstdio&gt;include &lt;cstdarg&gt;。 因为我没有使用 mingw32,所以我无法对此进行测试。

【讨论】:

  • 这些缺失的函数从 C++11 开始可用:en.cppreference.com/w/cpp/io/c/vfwscanf 所以我相信这是 MinGW 的内部问题。 (顺便说一句,它编译的证明:godbolt.org/z/cbdEhPcbP
  • @R2RT 我能以某种方式只显示“标准不兼容”的警告而不是非编译程序吗?我在网上搜了一下,好像没有。
  • 不幸的是,include &lt;cstdio&gt;include &lt;cstdarg&gt; 没有帮助。
  • @Learpcs 您的问题不在于您的代码与 c++98 不兼容。这 - 正如 R2RT 所写 - 很可能是这个特定编译器的内部问题。您可能会考虑将此报告为错误。
  • 另外,早在 2017 年就有人遇到过这个问题:stackoverflow.com/questions/46391363/…
【解决方案2】:

pow 是 C 函数,而不是 C++,因此请使用数学库的替代 C 头文件。

【讨论】:

  • 我认为使用 pow 很好,因为包含 cmath 并且我们正在使用命名空间 std。
  • 是的,但是“命名空间”不是 C 实体,因此当您尝试将 与 pow() 一起使用时,编译器正在查看 C++ 定义以了解如何执行 pow,但永远不会找到它。你需要 因为它包含 pow() 的所有原型。
  • 对不起,我不同意。 std::pow()(这是本例中调用的函数)在 中定义。
  • @AdaLovelace 因为有using namespace std,编译器也应该在std 命名空间中寻找pow,因此只需编译。 (::pow 调用可能会失败)。就像在非 MinGW 环境中一样。
  • 我试过了,但没有帮助。同样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 2015-11-03
相关资源
最近更新 更多