编程过程中遇到的“编译链接”类错误或警告积累

头文件包含错误

  将《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支持的功能”,后面几段文章也做了讨论。

________________________________________________________________________________

于swetch case相关变量声明位置错误及size_t的一次误用

  将《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;

______________________________________________________________________________

多线程Debug阶段 的编译错误 

  VC多线程编程时,在include process.h的情况下,还会出error C2065: '_beginthread' : undeclared identifier,这样的error信息。主要是配置文件的问题。

  对这个问题的原理,《Windows程序设计》931页做了具体讲解

____________________________________________________________________________

备注:最好找一本关于编译链接类错误的书,会省去不少时间,C++八大金刚中貌似有一本,书名待查。

原文地址:https://www.cnblogs.com/tingshuixuan2012/p/3124178.html