【轉】MFC中調試過程中查看輸出信息 -- 不錯


原文網址:http://blog.sina.com.cn/s/blog_4e24d9c501014o39.html

筆記&&方便查閱。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 在調試MFC程序時,我們經常需要查看特定位置變量的輸出值。或者在某特定條件執行時,給出一個輸出標識。

一般來說,有3種方法:

1) 調用TRACE(LPCTSTR lpszFormat, ...)函數

    在MFC中使用TRACE函數來打印輸出結果卻是非常方便,和在控制台程序中使用printf函數的使用方法和效果類似。不過有幾點  

    需要注意:一,TRACE函數的輸出是在Output窗口的Debug選項下; 二,只有在DEBUG版本調試時才會有輸出,如果是在

    Release版本調試或者運行程序時,將不會看到輸出。

========================================================================================================

 

1.在MFC中加入TRACE語句

2.在TOOLS->MFC TRACER中選擇 “ENABLE TRACING”點擊OK

3.進行調試運行,GO(F5)(特別注意:不是執行‘!’以前之所以不能看到TRACE內容,是因為不是調試執行,而是‘!’了,切記,切記)

4.然后就會在OUTPUT中的DEBUG窗口中看到TRACE內容了,調試執行會自動從BUILD窗口跳到DEBUG窗口,在那里就看到TRACE的內容了,^_^

以下是找的TRACE的詳細介紹:

 ================================================================================================

       TRACE宏對於VC下程序調試來說是很有用的東西,有着類似printf的功能;該宏僅僅在程序的DEBUG版本中出現,當RELEASE的時候該宏就完全消息了,從而幫助你調式也在RELEASE的時候減少代碼量。

使用非常簡單,格式如下:

TRACE("DDDDDDDDDDD");

TRACE("wewe%d",333);

同樣還存在TRACE0,TRACE1,TRACE2。。。分別對應0,1,2。。個參數

TRACE信息輸出到VC IDE環境的輸出窗口(該窗口是你編譯項目出錯提示的哪個窗口),但僅限於你在VC中運行你的DEBUG版本的程序。

TRACE信息還可以使用DEBUGVIEW來捕獲到。這種情況下,你不能在VC的IDE環境中運行你的程序,而將BUILD好的DEBUG版本的程序單獨運行,這個時候可以在DEBUGVIEW的窗口看到DEBUGVIE格式的輸出了。

VC中TRACE的用法有以下四種:

1:

TRACE   ,就是不帶動態參數輸出字符串,   類似C的printf("輸出字符串"); 
    
2:

TRACE   中的字符串可以帶一個參數輸出   , 類似C的printf("...%d",變量);

3:

TRACE   可以帶兩個參數輸出,類似C的printf("...%d...%f",變量1,變量2);

4:

TRACE 可以帶三個參數輸出,類似C的printf("...%d,%d,%d",變量1,變量2,變量3);

TRACE 宏有點象我們以前在C語言中用的Printf函數,使程序在運行過程中輸出一些調試信息,使我們能了解程序的一些狀態。但有一點不同的是:


TRACE 宏只有在調試狀態下才有所輸出,而以前用的Printf 函數在任何情況下都有輸出。和Printf 函數一樣,TRACE函數可以接受多個參數如:

int x = 1;
int y = 16;
float z = 32.0;
TRACE( "This is a TRACE statement\n" );
TRACE( "The value of x is %d\n", x );
TRACE( "x = %d and y = %d\n", x, y );
TRACE( "x = %d and y = %x and z = %f\n", x, y, z );

要注意的是TRACE宏只對Debug 版本的工程產生作用,在Release 版本的工程中,TRACE宏將被忽略。

 

 

來自:http://blog.csdn.net/jiang1013nan/article/details/4166017

========================================================================================================

2)使用AfxMessageBox( )函數來輸出信息

     這個函數在調試時也比較常用,使用方法簡單,此處就不做介紹。

 

==================================================================================================================

 

以下簡述MessageBox與AfxMessageBox之間的區別。

 

1、AfxMessageBox()函數在任何類里邊都可以使用,而MessageBox()函數只能在CWnd類的繼承類中使用。

2、AfxMessageBox()函數的參數沒有MessageBox()函數的參數豐富,所以后者較前者靈活。

3、AfxMessageBox不能控制消息框標題,常用於調試程序時的內部數據輸出或警告;MessageBox比較正式,常用在要提交的應用程序版本中,可以控制標題內容而不必采用含義不明的可執行文件名為標題。

 

int iRes = MessageBox("你看見消息框了嗎?","測試",MB_YESNO|MB_ICONWARNING);

if( iRes == IDYES )

MessageBox("看見了!");

 

 

AfxMessageBox的用法

 

int AfxMessageBox(

   LPCTSTR lpszText,

   UINT nType = MB_OK,  //缺省為0

   UINT nIDHelp = 0

);

 


字符串的類型是   LPCTSTR   。

解決辦法1: 將第4行改為:if(AfxMessageBox(_T("是否真的要退出當前程序?"),MB_YESNO)==IDYES)

 

 

 

解決辦法2:選擇“項目”菜單->項目屬性->配置屬性->常規->字符集,改為“未設置”即可。

我覺得我們還是盡量使用方法1來解決這個問題!

 

也就說字符串前面加上_T  就可以將你的字符串變為長字節類型了。。。。

 

LPCTSTR類型:

 

  L表示long指針 這是為了兼容Windows 3.1等16位操作系統遺留下來的,在win32中以及其他的32位操作系統中, long指針和near指針及far修飾符都是為了兼容的作用。沒有實際意義。

 

  P表示這是一個指針

 

  C表示是一個常量

 

  T表示在Win32環境中, 有一個_T宏

 

  STR表示這個變量是一個字符串

 

這個宏用來表示你的字符是否使用UNICODE, 如果你的程序定義了UNICODE或者其他相關的宏,那么這個字符或者字符串將被作為UNICODE字符串,否則就是標准的ANSI字符串。

 

  所以LPCTSTR就表示一個指向常固定地址的可以根據一些宏定義改變語義的字符串。

 

 

LPCTSTR == const TCHAR *

CString 和 LPCTSTR 可以說通用。 原因在於CString定義的自動類型轉換,沒什么奇特的,最簡單的C++操作符重載而已。

LPSTR lpstr = (LPSTR)(LPCTSTR)string;  

 

char buf[20];

AfxMessageBox(CString(buf),0,0);

========================================================================================================

3)將標准輸出定向到自己創建的控制台

      #include "io.h"
      #include "fcntl.h"

        void InitConsole()
      {
            int nRet= 0;
           FILE* fp;
           AllocConsole();
           nRet= _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
           fp = _fdopen(nRet, "w");
          *stdout = *fp;
          setvbuf(stdout, NULL, _IONBF, 0);
    }

  將此函數在MFC程序初始化的地方調用,即可使用控制台查看printf函數的打印信息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM