【问题标题】:cmath is throwing errors C2062, C2059, C2143 and C2447. cmath is included in the vector filecmath 抛出错误 C2062、C2059、C2143 和 C2447。 cmath 包含在矢量文件中
【发布时间】:2020-07-11 19:58:11
【问题描述】:

我正在编译这个旧的 C++ 项目。不是我写的。我正在尝试为我认识的人编译它。该代码可以追溯到 1990 年代初、1980 年代后期,尽管其中一些仍然是在 2008 年左右开发的。虽然我看到使用了 Visual Studio 2013。我正在尝试在 VS 2015 中编译它。长话短说,我在包含“vector”的地方出现错误。在向量中包含“cmath”,这就是错误出现的地方。显然,此代码已在 Visual Studio 的早期版本(即 2013 或 2010)中成功编译。

这是一个大型项目,因此很难完整呈现,但这里是包含矢量的源文件的顶部:

#ifndef EXPRESSAPPLICATION_H
#define EXPRESSAPPLICATION_H

#pragma warning (disable : 4786)

#include <windows.h>
#include <vector>
#include "ObjList.h"

这是错误列表:

严重性代码描述项目文件行抑制状态

错误 C2062 键入 'double' 意外 ExpressOffice C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cmath 17

错误 C2059 语法错误:')' ExpressOffice C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cmath 17

错误 C2143 语法错误:缺少 ';'前 '{' ExpressOffice C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cmath 18

错误 C2447 '{': 缺少函数头(旧式正式列表?) ExpressOffice C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cmath 18

错误 C2062 键入 'float' 意外 ExpressOffice C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cmath 30

错误 C2059 语法错误:')' ExpressOffice C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cmath 30

错误 C2143 语法错误:缺少 ';'前 '{' ExpressOffice C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cmath 31 错误 C2447 '{': 缺少函数头(旧式正式列表?) ExpressOffice C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cmath 31

错误 C2062 键入 'long double' 意外 ExpressOffice C:\Program 文件 (x86)\Microsoft Visual Studio 14.0\VC\include\cmath 328

错误 C2059 语法错误:')' ExpressOffice C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cmath 328

错误 C2143 语法错误:缺少 ';'前 '{' ExpressOffice C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cmath 329

错误 C2447 '{': 缺少函数头(旧式正式列表?) ExpressOffice C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cmath 329

以下是它在 cmath 中抱怨的代码行:

line 17:
_Check_return_ inline double abs(_In_ double _Xx) _NOEXCEPT
    {
    return (_CSTD fabs(_Xx));
    }

line 30:
_Check_return_ inline float abs(_In_ float _Xx) _NOEXCEPT
    {
    return (_CSTD fabsf(_Xx));
    }

line 328:
_Check_return_ inline long double abs(_In_ long double _Xx) _NOEXCEPT
    {
    return (_CSTD fabsl(_Xx));
    }

似乎只有 cmath 中的 abs() 函数 受到影响。其他数学函数均不受影响。我对这个问题感到困惑。感谢您对此的任何帮助!

【问题讨论】:

  • abs 更改为std::absfabs 更改为std::fabs
  • 也许windows.habs 定义了一个宏。您可以在包含windows.h 之后插入类似#ifdef abs #undef abs #endif 的内容(当然,在单独的行中)。
  • @chtz 如果是这个原因,可能交换两个包含,即将#include &lt;vector&gt; 放在#include &lt;windows.h&gt; 之前,可能会在没有手动取消定义的情况下有所帮助?
  • 无法与 VS 2015 或 2019 复制,因此问题出在未发布的代码中的其他地方。

标签: c++ visual-studio vector cmath


【解决方案1】:

我遇到了同样的错误,发现原因是因为我有

#include <math.h>

在几个源文件中,但我也有

#include <cmath>

在另一个源文件中。我将&lt;cmath&gt; 更改为&lt;math.h&gt; 并且它 解决了这个问题。

【讨论】:

  • OP 说他使用的是 C++,所以他应该使用 cmath 而不是 math.h
  • @John cmath 不能被使用代替 math.h,它们是非常不同的野兽,参见例如stackoverflow.com/questions/66660883/…(读到最后)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 2019-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多