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这三个类在互相导入头文件的时候出现一个死循环的过程,那样就永远都编译不过。
出现相关问题的人可以根据具体情况进行顺序上的调整。
- MFC中,编译器无法识别类等问题的另一种情况。
- ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务(另一种情况)
- ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务(另一种情况)
- C++11中auto、decltype等关键字不能在codeblacks的GNU编译器识别通过的问题的解决
- C++11中auto、decltype等关键字不能在codeblacks的GNU编译器识别通过的问题的解决
- 关于MySQL中视图、函数、触发器等的DEFINER无法识别的问题
- 未声明的标识符 某个类编译器无法识别
- NULL 以及LONG等标识符无法识别的问题
- vs2010+qt5.5 调用window7摄像头 +(无法识别Qcamera等类的问题以及遇到的bug)
- Java反编译器JAD等的另一种选择JD-Core/JD-GUI
- Java反编译器JAD等的另一种选择JD-Core/JD-GUI
- 关于win8中c-free等编译器调试时无法显示输出的解决方法
- error LNK2005的另一种情况
- 编译器在什么情况下无法产生类的四个默认函数
- Eclipse中无法识别插件问题的解决
- 解决Windows7中无法识别读卡器的问题
- MFC中实现缩放画图的另一种方式
- XCode中Categories的类出现无法识别函数的问题的解决办法
- sass继承 %占位符placeholder
- ubuntu15.10 配置tftp
- find命令中参数perm的用法
- UVa--437 The Tower of Babylon(dp)
- LA 5009 三分
- MFC中,编译器无法识别类等问题的另一种情况。
- 容器的allocator(容器配置器)(一)
- sass(混合宏vs继承vs占位符)
- POJ 2989 All Friends (极大团数量 + 全局变量局部变量)
- sass笔记之开始
- mysql 5.5中的半同步复制
- 新生项目总结之---组织管理与文档的书写
- 容器配置器(allocator)(二)
- Base64 加密之中文乱码