【发布时间】: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::abs和fabs更改为std::fabs。 -
也许
windows.h为abs定义了一个宏。您可以在包含windows.h之后插入类似#ifdef abs #undef abs #endif的内容(当然,在单独的行中)。 -
@chtz 如果是这个原因,可能交换两个包含,即将
#include <vector>放在#include <windows.h>之前,可能会在没有手动取消定义的情况下有所帮助? -
无法与 VS 2015 或 2019 复制,因此问题出在未发布的代码中的其他地方。
标签: c++ visual-studio vector cmath