1

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

4

3 回答 3

2

因为这是 C++,你应该为你自己的东西使用一个命名空间,特别是如果你有全局变量。

#include "stdafx.h"

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

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

using MyApp::y1; // Now also y1
于 2012-09-16T00:47:09.423 回答
0

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

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

于 2012-09-16T01:17:43.917 回答
0

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

using namespace std;

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

作为旁注,尝试显示整个代码,因为这里_tmain调用的内容不清楚Main

于 2012-09-16T02:20:40.133 回答