VC++2008 Feature Pack引用主视图头文件失败

我新建了一个VS2005界面,SDI,默认视图:CFORMVIEW的项目。写了几个类,然后满怀高兴的打算在CMainFrame中进行视图切换。但当#include “项目名称View.h”的时候遇到了一个棘手的问题,系统编译时报错: 

error C2143: 语法错误 : 缺少“;”(在“*”的前面) 

缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

“GetDocument”: 缺少返回类型;假定为返回“int”的成员函数

当看到这样的错误的时候,你可能会第一时间意识到头文件被重复引用了,类被重定义了。原因很简单,1.该错误是由于增加 #include 语句引发的,2.头文件的重定义也会同样的报错。

    顺着这个思路,我找遍了所有头文件,所有的头文件都加上了#pragma once,并一个个调整#include 的顺序,调了N久,错误依旧!最后连

#ifndef 文件名_H
#define 文件名_H
// 代码
#endif
的声明格式都运用了,众多的猜疑一一试过,最后还是一筹莫展,开始怀疑是Feature Pack 本身的问题。通过对比VC2008旧MFC的版本,发现了蛛丝马迹!

    Feature Pack新类中多声明了这函数:C项目名称Doc* GetDocument() const;这个函数声明得十分离奇,又回想到编译错误提醒第四项:“GetDocument”: 缺少返回类型;假定为返回“int”的成员函数!大胆猜猜错误与这个东东有莫大关系。这一反大多数人的调试思路——一般调错误都先调系统报的第一个错误!心动不如行动,根据经验,GetDocument是非运行必须函数,所以立刻屏蔽了相关代码。重新编译,终于成功通过了!

主要需要屏蔽的代码如下:

CXXXERPDoc* GetDocument() const;

CXXXERPDoc* CXXXERPView::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CXXXERPDoc)));
return (CXXXERPDoc*)m_pDocument;
}

    调试这个错误主要有一下几个思维陷阱:1.添加#include后出错,联想到重定义,或注意力太集中于这行代码;2.调试错误时习惯先看第一条错误,而真正有用的信息在第四条错误信息上;3.对系统自动生成的代码过于依赖,甚少质疑或主动修改;4.报错与头文件引用错误出奇的相似。

    Feature Pack的华丽界面确实有独到的吸引力,但由于才发布一年左右,网上的相关资料很少,要有程序员能吃透这个类库,估计也得花两三年时间吧。遇到很多问题需要自食其力,自己寻找答案。新东西找错误,看文档的功夫少不了,真的是要靓不要命了!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值