如何在Visual Studio C++中处理数学.h污染
How to deal with math.h pollution in Visual Studio C++?
在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
。
相关文章:
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 处理除以零会导致<csignal>意外行为
- 是否可以在c++中处理字符串流中的各个元素
- 如何在Visual Studio C++中处理数学.h污染