博客( 从 VC6.0 到 VC2008-转自 CSDN 博客(blog.csdn.net/orbit) 转自 ) 一、_WIN32_WINNT 与 _WIN32_IE 设置冲突
_WIN32_WINNT 与 _WIN32_IE 设置不兼容会导致如下 C1189 致命错误:
StdAfx.cpp c:\program files\microsoft sdks\windows\v6.0a\include\sdkddkver.h(217) : fatal error C1189: #error : _WIN32_WINNT settings conflicts with _WIN32_IE setting StdAfx.cpp 通常是项目中第一个编译的文件,这个错误将导致编译无法继续进行。产生这个错误的原因是 原因是_WIN32_WINNT 的版本定义太老,老的 VC 代码对_WIN32_WINNT 的典型设置是:
#ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #endif 0x0400 相对于 VS2008 所带的 Plarform SDK (在文件 sdkddkver.h 中) 中_WIN32_IE 的定义来说太老了, 导致不兼容,可以将其改成 0x0501 或更高的版本避免这个问题,如下所示:
#ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif 也可以将这三行_WIN32_WINNT 定义删除,这样就会使用 Plarform SDK 中的_WIN32_WINNT 定义,自 然就不存在不兼容问题了。不过出于对老版本 VC 的兼容考虑(毕竟以后可能还要使用 VC6 编译代码), 最好这样修改:
#if _MSC_VER <= 1200 // MFC 6.0 or earlier #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #endif #endif 二、afximpl.h 文件中的语法错误 MFC 出现的时候 STL 还没有成为 C++的标准, 所以 MFC 使用一套自己的模版库, 比如 CArray、 CList、 CMap 等等,这些类型声明都在 afximpl.h 文件中。原来在 VC6 编译器适用的模版语法可能不适用 VC9, 特别是当以下四个环境变量设置不兼容时,就会出现这个编译错误,大致情况如下:
e:\software\microsoft visual studio 9.0\vc\atlmfc\src\mfc\afximpl.h(625) : error C2059: syntax error : '
' e:\software\microsoft visual studio 9.0\vc\atlmfc\src\mfc\afximpl.h(625) : error C2238: unexpected token(s) preceding ';' e:\software\microsoft visual studio 9.0\vc\atlmfc\src\mfc\afximpl.h(629) : error C2059: syntax error : '' e:\software\microsoft visual studio 9.0\vc\atlmfc\src\mfc\afximpl.h(629) : error C2238: unexpected token(s) preceding ';' 合理调整 stdafx.h 中 WINVER、_WIN32_WINNT、_WIN32_WINDOWS 和_WIN32_IE 的设置可以避免这 个问题,将三个与 Windows 版本有关的环境变量设置为 0x0501 或更高版本,将 IE 版本的环境变量设置 为 0x0500 以后的版本就可以解决这个问题。当然,考虑到与旧的 VC6 代码兼容,可以采用上一个问题中 提到的最后一个解决办法,用_MSC_VER 进行隔离。 三、 旧的 CRT 库和新的安全 CRT 库引起的 C4996 告警 解决了环境变量设置不匹配导致的问题后,编译过程就真正开始了,不过首先映入眼帘的应该是成堆的 C4996 编译告警,对每个使用了含字符串参数的 CRT 库函数都会有 C4996 编译告警,一个典型的输出如 下所示:
f:\project\.....\commonfunc.cpp(280) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. e:\software\microsoft visual studio 9.0\vc\include\string.h(74) : see declaration of 'strcpy' MSDN online 是这样解释的:为了显著增加 CRT 库的安全性,许多 CRT 函数都有了一个更安全的新 版本,新版本和旧版本的区别就是新版本函数名多了一个_s 后缀。只要一个 CRT 函数有新的安全版本, 编译器就会产生一个 C4996 告警, 不过, 出现这个告警的目的并不是说旧版本的 CRT 函数将淡出 CRT 库, 告警出现只是为了提醒程序员这个函数有更安全的版本存在。一种安全的或者是被鼓励的做法是用安全版 本的函数替换现有的 CRT 函数,不过对于一个有