如何在Visual Studio C ++中处理math.h污染?

时间:2012-09-16 00:44:43

标签: c++ visual-studio namespaces standards-compliance

在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是否以一致的方式处理此问题?

3 个答案:

答案 0 :(得分:2)

由于这是C ++,你应该使用命名空间来做你自己的事情,特别是如果你有全局变量。

#include "stdafx.h"

namespace MyApp
{
    int y1; // MyApp::y1
}

这样,您可以依赖使用关键字,您需要在不使用命名空间名称的情况下使用y1变量:

using MyApp::y1; // Now also y1

答案 1 :(得分:0)

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

y1()是“第二类贝塞尔函数”之一(我不太清楚这意味着什么)。这是specified by POSIX

答案 2 :(得分:0)

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

using namespace std;

... 不要。如您所见,您自己在全局命名空间中引入了歧义。相反,尝试从std明确指定您需要的内容,而不是使用已包含的标头中声明的std成员来污染全局命名空间。您还应该避免使用全局变量和全局命名空间本身。

作为旁注,请尝试显示整个代码,因为不清楚_tmain是否已在此处调用Main