1 问题引入
使用VC++6.0编写程序时,使用一个名为“InitializeCriticalSectionAndSpinCount”的函数,该函数的作用是初始化临界节和自旋锁的数量。
在进行程序编译时,报如下错误:
“error C2065:’InitializeCriticalSectionAndSpinCount’:undeclare identifier”
该函数所在头文件是“Winbase.h”,库函数是“Kernel32.lib”。在程序中添加头文件和库函数之后,依然报错。
2 问题分析
在“Winbase.h”中找到对“InitializeCriticalSectionAndSpinCount”函数声明的位置,发现有如下代码
#if (_WIN32_WINNT >= 0x0403)
//之后为InitializeCriticalSectionAndSpinCount()函数的声明代码
产生以上问题的原因是没有对_WIN32_WINNT赋值,所以导致该函数没有声明。
3 问题解决
在自己编写程序的StdAfx.h中添加如下代码:
#define _WIN32_WINNT 0x5000
之后再次编译,编译成功。
4 问题扩展
4.1 预处理器变量
#define指示接受一个名字并定义该名字为预处理器变量。预处理器变量的名字在程序中必须是唯一的。任何与预处理器变量相匹配的名字的使用都关联到该预处理器变量。所以,在自己编写的StdAfx.h中定义的_WIN32_WINNT与在winbase.h中用到的_WIN32_WINNT是同一个预处理器变量。
4.2 Windows版本宏
_WIN32_WINNT是Windows版本宏,除了_WIN32_WINNT之外,Windows版本宏还包括了_WIN32_WINDOWS和WINVER。对于Windows95/98/Me,Windows的版本宏是_WIN32_WINDOWS,对于Windows2000/XP/Server2003/Vista/Server2008 /Win7/Win8来说,Windows的版本宏是_WIN32_WINNT,而WINVER是_WIN32_WINNT的别名。
系统名 | 系统版本号 |
Windows 2000 | 0x0500 |
Windows XP | 0x0501 |
Windows Server 2003 | 0x0502 |
Windows Vista | 0x0600 |
Windows Server 2008 | 0x0600 |
Windows 7 | 0x0601 |
Windows 8 | 0x0602 |