VC++编译中出现的几个警告

目录

警告不是什么好东西,《Effective C++》中强调警告就是错误,那就来一场消灭烦人警告的战役吧。

第一位,warning LNK4006
类似warning LNK4006: “public: int __thiscall CvImage::width(void)const ” (?width@CvImage@@QBEHXZ) already defined in highguid.lib highgui100d.dll); second definition ignored的提示一出现就有一大堆。
与opencv库相关,主要由于重复引用opencv的lib库,一般出现在多个项目中。解决方法是在最后执行的那个项目中引用opencv库文件,前面的项目不要引用。
可以看下StackOverflow中对这个问题的讨论
第二位,warning C4996
类似 ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
不厌其烦地提示应该使用更安全的CRT函数,但往往很多开源代码没有考虑这点,修改起来很费事,做研究对安全的要求又不高,可以把这条消息屏蔽掉。在程序中#define _CRT_SECURE_NO_WARNINGS 即可。也可在最后项目的“属性- 配置属性 – C/C++  – 命令行”中,命令行增加 /D _CRT_SECURE_NO_WARNINGS。
第三位,warning C4482:
使用了非标准扩展: 限定名中使用了枚举。文件中的枚举类型名不需要特意指出,因为其中定义的枚举变量就相当于常量。
第四位,与数值类型窄化相关。
double 截断到 int型,这类可以用static_cast强制转换,避免警告信息。
double 截断到 float型,例如
[cpp]
float a = 9e9;
float b = 9e9f;
[/cpp]
数值常量默认为double类型,后面加上f就表示是float类型。所以第一条有警告,而第二条没有。
第五个,warning C4018: “<”: 有符号/无符号不匹配 两种方法,用相同类型的变量,一般都是由size_t引起的,或者用强制类型转换。 第六个,warning C4005: “MAX”: 宏重定义 这个更简单了,在宏重定义的地方检测宏是否定义,可以重新定义宏。 [cpp] #undef SOME_MACRO // 取消宏定义,无论之前是否定义过宏 #define SOME_MACRO [/cpp] 也可以补充定义宏。 [cpp] #ifndef SOME_MACRO #define SOME_MACRO #endif [/cpp] 以上排名没有先后。(^.^) 还有最常见的一个错误: error LNK2005 符号重复定义 一个很可能的原因就是多项目中项目代码生成运行库的选项不一致,/MDd、/MTd等应该一致。参看一篇博文《Visual C++ 编译器选项 /MD、/ML、/MT、/LD》和MSDN的《/MD、/MT、/LD(使用运行时库)》。