C++ Cmath.h 问题导致变量不在全局命名空间中

Posted

技术标签:

【中文标题】C++ Cmath.h 问题导致变量不在全局命名空间中【英文标题】:C++ Cmath.h issue leading to variables not being in theglobal namespace 【发布时间】:2020-01-20 18:06:01 【问题描述】:

在 Visual Studio 中运行 C++ 时,我正在尝试编写一个简单的 Hello World 命令。但是,当我这样做时,我不断遇到这个问题。

1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\math.h(1,1): warning C4821: Unable to determine Unicode encoding type, please save the file with signature (BOM) 
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\cstdlib(24,18): error C2039: 'fabs': is not a member of '`global namespace'' 
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\cstdlib(24,22): error C3861: 'fabs': identifier not found 
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\cstdlib(28,18): error C2039: 'fabsf': is not a member of '`global namespace'' 
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\cstdlib(28,23): error C3861: 'fabsf': identifier not found 
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\cstdlib(32,18): error C2039: 'fabsl': is not a member of '`global namespace'' 
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\cstdlib(32,23): error C3861: 'fabsl': identifier not found 
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\cmath(26,47): warning C4244: 'argument': conversion from 'double' to 'int', possible loss of data 
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\cmath(30,18): error C2039: 'acosf': is not a member of '`global namespace'' 
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\cmath(30,23): error C3861: 'acosf': identifier not found 
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\cmath(34,18): error C2039: 'acoshf': is not a member of '`global namespace'' 
(etc)
#include <iostream>

int main()

    std::cout << "Hello World!\n";
    return 0;


问题似乎来自这些行的 cmath 头文件内部。

_NODISCARD _Check_return_ inline float acos(_In_ float _Xx) noexcept /* strengthened */ 
    return _CSTD acosf(_Xx);


_NODISCARD _Check_return_ inline float acosh(_In_ float _Xx) noexcept /* strengthened */ 
    return _CSTD acoshf(_Xx);


_NODISCARD _Check_return_ inline float asin(_In_ float _Xx) noexcept /* strengthened */ 
    return _CSTD asinf(_Xx);

我应该注意,这些错误存在于 cmath 头文件的大部分中,而不仅仅是此处显示的错误,但我认为包含数百个错误没有用处。

这与 Visual Studio 依赖项有关吗?有什么办法可以避免这个错误?

我正在安装一个干净的 Visual Studio。

【问题讨论】:

你是不是偶然使用了预编译的头文件? 如果我是,我不是故意这样做的。如何检查我是否存在?对不起,我是新来使用视觉的。 右键项目,进入属性,C/C++,预编译头文件。第一行应该说“不使用预编译头” 我改变了,条目是空白的,但我把它改成了“不使用预编译头”。仍然遇到同样的问题。 好的,正在检查。有时预编译的头文件会导致问题。编译的时候,错误还在吗?错误Exxxx 是一个智能感知错误,并不总是真正的错误。编译器错误将以 C 开头 【参考方案1】:

在一阵痛苦之后,我发现了问题所在。基本上我的 math.h 文件已经损坏,只是发布了 NULLS。

我进入了 Windows 工具包中的 UCRT 文件,并从以前的发行版中复制了一个 math.h 文件。现在一切正常。

同样的技巧适用于进入您的项目属性并将您的 SDK 版本更改为与当前版本不同的版本。

【讨论】:

以上是关于C++ Cmath.h 问题导致变量不在全局命名空间中的主要内容,如果未能解决你的问题,请参考以下文章

C++命名空间

C++命名空间

C++中当未命名空间跟全局变量在一起的时候,怎么调用未命名空间里的变量

C++入门之命名空间

C++ 从 std::async 函数读取命名空间中的全局变量标志

c++之命名空间(namespace)