MFC中,编译器无法识别类等问题的另一种情况。

来源:互联网 发布:linux stopped 编辑:程序博客网 时间:2024/05/26 12:59

我在写MFC的程序的时候,经常会碰到一些很莫名其妙的事情,就是当你写了一些代码之后,编译无法通过,然后提示某行根本不相关的代码,缺少分号,不能使用默认的int类型等等,分析之后,总体上都是因为一个问题:编译器无法识别某些类了,或者是某些类中的自定义变量类型。其实我们也是按照正规的流程下来的,但是最后就是无法识别了,这种错误很莫名其妙,现在让我来讲一下我历时3天发现的一种情况。

我在做一个项目的时候,创建了一个Expara.h和Expara.cpp,用来定义和声明全区变量,然后一个AdoAccess类,用来连接Access数据库,还有一个CBeam类,是我所做的项目中的一个对象。CBeam类我在Expara中定义并声明了一个全局的对像,使用起来更方便。而在预编译头文件stdafx.h中,我把Expara头文件也放进去了,这样就不用在每个类中都对CBeam进行头文件声明而直接可以使用全局变量。按照连接Access数据库的规范,在stdafx.h中加入了#import "c:\\program files\\common files\\system\\ado\\msado15.dll" no_namespace rename("EOF","adoEOF") 这样一句导入动态链接库的话。一开始一切OK,但是,当我在CBeam中定义了一个AdoAccess的对像时,就炸了!AdoAccess中的所有变量类型无法识别了。然后怎么弄的不行。

历时三天,我终于明白原因了。因为在stdafx.h中, 如下图

当预编译的时候,由于语句的先后顺序,先对#include “Expara.h”进行编译,而在Expara.h中,代码如下图:

在Expara.h中,有声明CBeam的,所以开始编译CBeam,而CBeam中有用到AdoAccess.h,所以开始编译AdoAccess.h,代码如下

开始编译上面这一段,但是,_ConnectionPtr,_RecordsetPtr,_CommandPtr这三个变量是在动态链接库msado15.dll中的,即是在stdafx.h中的#import "c:\\program files\\common files\\system\\ado\\msado15.dll" no_namespace rename("EOF","adoEOF") 执行后才有用的。然而按照顺序呢编译,并没有编译到这一段代码,所以编译器此时就无法识别这三个变量类型,于是就会报错。

这样的错误很巧妙的是,编译会报错,但是在你编译代码时,将对象进行.或者->时,相应的变量、函数是能够被vs所提示出来的,所以大家很容易觉得编译器其实是识别了的。但是其实编译是通不过的。

原因明白了,解决方法就超级简单了,将预编译头中的stdafx.h中的#include "Expara.h"放到#import "c:\\program files\\common files\\system\\ado\\msado15.dll" no_namespace rename("EOF","adoEOF") 后面,就可以了,我这里将AdoAccess.h这个头文件也放在了预编译头里面是为了防止Expara、CBeam、AdoAccess这三个类在互相导入头文件的时候出现一个死循环的过程,那样就永远都编译不过。

出现相关问题的人可以根据具体情况进行顺序上的调整。

0 0