将《Windows程序设计(第5班)珍藏版》第40页的“HELLOWI N.C”程序在VC++6.0中运行,出现如下运行错误:
error LNK2001: unresolved external symbol __imp__PlaySoundA@12
在CSDN论坛与错误相同标题的帖子#2找到答案,但是,将如下头文件包含进程序后
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
又出现如下编译错误:
error C2146: syntax error : missing ';' before identifier 'MMVERSION' fatal error C1004: unexpected end of file found
这时想起《Windows程序设计》30页的关于包含头文件的一段话:
“如果TCHAR已经在某个头文件中被定义了,WINNT.H和WCHAR.H头文件都能防止TCHAR数据类型被重复定义。不管怎样,无论何时你在你的程序中使用其它头文件时,都应在所有其它头文件之前先包含WINDOWS.H头文件”,至此,将头文件
#include <windows.h>
放在程序最顶部,问题解决。
在查找相关章节的过程中,解决了关于“怎样判断程序是否定义了Unicode标识符”一个疑问,在《Windows程序设计》30页,指出“WINNT.H则负责处理基本的Unicode支持的功能”,后面几段文章也做了讨论。
________________________________________________________________________________
将《Windows程序设计》第40代码的回调函数对WM_PAINT的处理中加入如下代码:
GetClientRect(hwnd,&rect); for( x = 0; x < rect.right; x+=100) { MoveToEx(hdc,x,0,NULL); LineTo(hdc,x,rect.bottom); }
旨在客户区绘制一些竖线,首先代码中x是没有被定义的,这个一眼可以看出,错误也常见,如下:
error C2065: 'x' : undeclared identifier
那直接在for循环中x的前面加上int是不是可以呢,运行一下,错误如下:
error C2360: initialization of 'x' is skipped by 'case' label
在百度知道找到答案:在case里面不能直接定义变量
剩下的工作不难做,在回调函数首部定义x即可,同时也测试了一下使用size_t来定义x的情况,出现如下警告;
warning C4018: '<' : signed/unsigned mismatch
在《C++ Primer》中讲解了size_t相对于int的一些优势,但这些优势只是在二者可以通用的使用相对而言的,并不是说size_t任何时候都可以替代int,本质上讲它们用来定义不同的类型,这次运行中的警告就是一个例子。
严格意义上讲,x的定义应该用long才准确,因为RECT的结构如下:
typedef struct _RECT { LONG left; LONG top; LONG right; LONG bottom; } RECT, *PRECT;
______________________________________________________________________________
VC多线程编程时,在include process.h的情况下,还会出error C2065: '_beginthread' : undeclared identifier,这样的error信息。主要是配置文件的问题。
对这个问题的原理,《Windows程序设计》931页做了具体讲解
____________________________________________________________________________
备注:最好找一本关于编译链接类错误的书,会省去不少时间,C++八大金刚中貌似有一本,书名待查。