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