如何在Visual Studio C++中处理数学.h污染

How to deal with math.h pollution in Visual Studio C++?

本文关键字:处理 污染 C++ Visual Studio      更新时间:2023-10-16

在Visual Studio 2012中,我无法将某些名称声明为全局标识符,因为它们已经在math.h中声明了。遗留问题使我不方便重命名源代码中的标识符。除了重命名,还有哪些选项?

#include "stdafx.h"
// iostream includes math.h which declares the following
_CRT_NONSTDC_DEPRECATE(_y1) _CRTIMP double  __cdecl y1(_In_ double _X);
int y1; // error - y1 is already declared
void Main()
{
    return;
}

附加问题:Visual Studio 2012是否以一致的方式处理此问题?

由于这是C++,您应该为自己的东西使用命名空间,尤其是当您有全局变量时。

#include "stdafx.h"
namespace MyApp
{
    int y1; // MyApp::y1
}

通过这种方式,您可以依赖using关键字,其中您需要使用不带名称空间名称的y1变量:

using MyApp::y1; // Now also y1

标识符y1可能出现在某些版本的<math.h>中,但它不是由C或C++标准定义的。您应该能够以避免声明y1的方式调用编译器,可能是通过禁用语言扩展。如果编译器不允许你这样做,那就是实现中的一个错误。

y1()是"第二类贝塞尔函数"之一(我不太确定这意味着什么)。它由POSIX指定。

正如我在评论中所说,iostream将不包括math.h,而是包括cmath。细微的区别在于cmath将所有内容都放在std命名空间中。问题是你正在做以下事情。。。

using namespace std;

不要。正如您所看到的,您自己在全局名称空间中引入了一个模糊性。相反,尝试从std中明确指定您需要的内容,而不是用包含的标头中声明的任何std成员来污染全局命名空间。您还应该避免使用全局变量和全局命名空间本身。

附带说明一下,尝试显示整个代码,因为这里不清楚_tmain调用了Main