整理: MFC调试

Release模式下,输出调试信息.

起因: 最近的程序中使用了Xtreme做界面, 程序中有时是编译不过去, 有时在Debug下调试时报错.

如果全记录成FileLog, 因为那样就离开了IDE, 太不方便.

只能把程序编译成有调试库的Release版本, 调试完再把调试库去掉.

现在发现了OutputDebugString, 解决了在Release模式下, 向IDE的Output window输出调试信息的问题.

if(m_wndPropertyGrid.Create( rc, this, IDC_PROPERTY_GRID_ON_VIEW)) { TRACE("Property grid create ok/n");//Release模式下, 不可以输出到IDE的OutputWindow OutputDebugString("Property grid create ok/n"); //Release模式下可以输出到IDE的OutputWindow }

 

在编译期间检查宏

/** * @file UserDefine.h * @brief 在编译期间检查宏 */ #if !defined(_USER_DEFINE_H_) #define _USER_DEFINE_H_ #pragma message( "编译[" __FILE__ "]") #pragma message( "最后修改时间[" __TIMESTAMP__ "]") #ifdef _CPPRTTI #pragma message("条件满足: Enable RTTI")// #else #error "Must Enable Option RTTI"; //#error 必须是英文信息, 中文乱码 #endif #if !defined(_MSC_VER) #pragma message("本工程只能在VSIDE下编译") #error "" #endif #if (_MSC_VER < 1100) || (_MSC_VER > 1400) #pragma message("只支持MS VC++ 5/6/7/7.1/8") #error "" #endif #ifndef _MFC_VER #pragma message("本程序使用MFC, 请添加MFC支持") #error "" #endif #if defined(G_INT_LEN_MSG_MAX) #pragma message("G_INT_LEN_MSG_MAX 重复定义") #error "" #endif #define G_INT_LEN_MSG_MAX 2048 //最大的消息缓冲区长度 /** * @note * * 编译通过的样子 * 编译[d:/lsprj/subjectresearch/编译时检查当前文件宏定义/src/mainprog/checkmacrodefine/userdefine.h] * 最后修改时间[Sat Nov 27 22:08:16 2010] * 条件满足: Enable RTTI * * 编译通不过时, F4指到#error所在行 */ #endif //#ifndef _USER_DEFINE_H_

 

CString报错的临时解决方法, 用string代替CString

环境: vc6 + Xtreme

推测: CString放在结构中, 当结构是new出来的结构指针时,

可能CString拷贝构造函数出了问题.

#include <string> using namespace std; struct structPropertyGrid_Rule { CXTPPropertyGridItem * pMyPropertyGridItem; string strRuleName; /** CString 不行, 赋值操作报错 */ structPropertyGrid_Rule * pPrevRule; structPropertyGrid_Rule * pNextRule; };

DWORD CMainView::AddNewRules(structPropertyGrid_Rule ** ppstructPropertyGrid_Rule, PCHAR pRuleName) { structPropertyGrid_Rule * pstructPropertyGrid_Rule = NULL; if(!ppstructPropertyGrid_Rule) return S_FALSE; if(!(*ppstructPropertyGrid_Rule)) *ppstructPropertyGrid_Rule = CreatestructPropertyGrid_Rule(); pstructPropertyGrid_Rule = *ppstructPropertyGrid_Rule; pstructPropertyGrid_Rule->pMyPropertyGridItem = m_wndPropertyGrid.AddCategory(pRuleName); pstructPropertyGrid_Rule->strRuleName = pRuleName; //如果strRuleName是CString, 执行到这句就报错. return S_OK; }

 

<2010_1202>

结构和数据类的选择

 

如果数据类和别的多个类之间耦合紧, 相互引用较多, 要把结构改成数据类. 要不编译不过.

相互引用的地方用包含头文件和增加前向定义来解决编译问题.

 

<2010_1231>

增加自定义警告消息

// MyWarningMsg1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #define __MY_STR2__(x) #x #define __MY_STR1__(x) __MY_STR2__(x) #define _MY_WARNING_ __FILE__ "("__MY_STR1__(__LINE__)") : 警告:" int main(int argc, char* argv[]) { #ifndef NDEBUG #pragma message(_MY_WARNING_"请注意, 这不是发布版本!") #endif /** * 编译后, 在IDE的Output区出现消息 * D:/Tmp/MyWarningMsg1/MyWarningMsg1.cpp(14) : 警告:请注意, 这不是发布版本! * 编译后, 如果没有定义NDEBUG, 按F4, 会定位到上面那句 #pragma message(_MY_WARNING_ */ printf("Hello World!/n"); return 0; }

 

包含ATL函数时,只需要包含一个.h

#include <atlbase.h>

 

判断指针类型

BOOL CTestViewDoc::JudgeView() { /** * below code in xxDoc.cpp */ POSITION pos = GetFirstViewPosition(); CView * pView = GetNextView(pos); /** * 判断指针的类型, * CObject::IsKindOf, IsKindOf + RUNTIME_CLASS */ if(!pView->IsKindOf(RUNTIME_CLASS(CTestViewView))) { LsLogRuntime("pView 无效, 不是本Doc预期的View指针"); return FALSE; } return TRUE; }

 

你可能感兴趣的:(整理: MFC调试)