一:编译头文件:STDAFX.CPP,STDAFX.H
这两个文件用于建立一个预编译的头文件.PCH和一个预定义的类型文件STDAFX.OBJ。由于MFC体系结构非常大,包含许多头文件,如果每次都编译的话比较费时。因此,我们把常用的MFC头文件都放在stdafx.h中,如afxwin.h、afxext.h、afxdisp.h、afxcmn.h 等,然后让stdafx.cpp包含这个stdafx.h文件。这样,由于编译器可以识别哪些文件已经编译过,所以stdafx.cpp就只编译一次,并生成所谓的预编译头文件(因为它存放的是头文件编译后的信息,故名)。如果读者以后在编程时不想让有些MFC头文件每次都被编译,也可以将它加入到 stdafx.h中。采用预编译头文件可以加速编译过程。
二:#pragma comment(lib, "comsupp.lib")
是个预编译命令,意思是链接COMSUPP.LIB这个库文件。等价于在project|settings|link|Object/library modules中加入COMSUPP.LIB。只不过#pragma comment( lib, "comsupp.lib" )是用写程序的方式写出来而已。
可以把这条语句去掉,然后在project|settings|link|Object/library modules中加入COMSUPP.LIB,效果是一样的。
三:每一个cpp文件都必须包含stdafx.h?
Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻。
为避免这种浪费,AppWizard和Visual C++编译程序一起进行工作,如下所示:
◎AppWizard建立了文件stdafx.h,该文件包含了所有当前工程文件需要的MFC include文件。且这一文件可以随被选择的选项而变化。
◎AppWizard然后就建立stdafx.cpp。这个文件通常都是一样的。
◎然后AppWizard就建立起工程文件,这样第一个被编译的文件就是stdafx.cpp。
◎当Visual C++编译stdafx.cpp文件时,它将结果保存在一个名为stdafx.pch的文件里。 (扩展名pch表示预编译头文件。)
◎当Visual C++编译随后的每个.cpp文件时,它阅读并使用它刚生成的.pch文件。 Visual C++不再分析Windows include文件,除非你又编缉了stdafx.cpp或stdafx.h。
这个技术很精巧,你不这么认为吗?(还要说一句,Microsoft并非是首先采用这种技术的公司,Borland才是。) 在这个过程中你必须遵守以下规则:
◎你编写的任何.cpp文件都必须首先包含stdafx.h。
◎如果你有工程文件里的大多数.cpp文件需要.h文件,顺便将它们加在stdafx.h (后部)上,然后预编译stdafx.cpp。
◎由于.pch文件具有大量的符号信息,它是你的工程文件里最大的文件。
如果你的磁盘空间有限,你就希望能将这个你从没使用过的工程文件中的.pch文件删除。执行程序时并不需要它们,且随着工程文件的重新建立,它们也自动地重新建立。
四:_MSC_VER, VC_EXTRALEAN,
1、_MSC_VER,Defines the MFC version;定义编译器的版本,VC++6.0就是1200;
#if _MSC_VER > 1000的意思就是如果编译器版本高于1000(VC++5.0)
2、#define VC_EXTRALEAN //从 Windows 标头中排除不常使用的资料
像这类似的宏定义表示定义了一个空宏,这个宏不作任何替换,其实,宏定义是给编译器看的,不一定有值,没有值的宏只是作为一个符号[作为预处理的控制标志]。
这种宏
第1可以用来作扩展
当你需要作替换的时候直接添加值
第2 可以用来作判断
#ifdef VC_EXTRALEAN
五:#pragma once
表示在编译的时候, 这个文件只被包含(include)一次;这样, 减少整个编译过程中打开这个文件的次数
六:编译时常见错误
1、fatal error C1010: unexpected end of file while looking for precompiled header directive。
寻找预编译头文件路径时遇到了不该遇到的文件尾。(一般是没有#include "stdafx.h")
2、fatal error C1083: Cannot open include file: ''R…….h'': No such file or directory
不能打开包含文件“R…….h”:没有这样的文件或目录。
3、error C2011: ''C……'': ''class'' type redefinition
类“C……”重定义。
4、error C2018: unknown character ''0xa3''
不认识的字符''0xa3''。(一般是汉字或中文标点符号)
5、error C2057: expected constant expression
希望是常量表达式。(一般出现在switch语句的case分支中)
6、error C2065: ''IDD_MYDIALOG'' : undeclared identifier
“IDD_MYDIALOG”:未声明过的标识符。
7、error C2082: redefinition of formal parameter ''bReset''
函数参数“bReset”在函数体中重定义。
8、error C2143: syntax error: missing '':'' before ''{''
句法错误:“{”前缺少“;”。
9、error C2146: syntax error : missing '';'' before identifier ''dc''
句法错误:在“dc”前丢了“;”。
10、error C2196: case value ''69'' already used
值69已经用过。(一般出现在switch语句的case分支中)
11、error C2509: ''OnTimer'' : member function not declared in ''CHelloView''
成员函数“OnTimer”没有在“CHelloView”中声明。
12、error C2511: ''reset'': overloaded member function ''void (int)'' not found in ''B''
重载的函数“void reset(int)”在类“B”中找不到。
13、error C2555: ''B::f1'': overriding virtual function differs from ''A::f1'' only by return type or calling convention
类B对类A中同名函数f1的重载仅根据返回值或调用约定上的区别。
14、error C2660: ''SetTimer'' : function does not take 2 parameters
“SetTimer”函数不传递2个参数。
15、warning C4035: ''f……'': no return value
“f……”的return语句没有返回值。
16、warning C4553: ''= ='' : operator has no effect; did you intend ''=''?
没有效果的运算符“= =”;是否改为“=”?
17、warning C4700: local variable ''bReset'' used without having been initialized
局部变量“bReset”没有初始化就使用。
18、error C4716: ''CMyApp::InitInstance'' : must return a value
“CMyApp::InitInstance”函数必须返回一个值。
19、LINK : fatal error LNK1168: cannot open Debug/P1.exe for writing
连接错误:不能打开P1.exe文件,以改写内容。(一般是P1.Exe还在运行,未关闭)
20、error LNK2001: unresolved external symbol "public: virtual _ _thiscall C……::~C……(void)"
连接时发现没有实现的外部符号(变量、函数等)。
阅读(2918) | 评论(0) | 转发(0) |