學習C/C++多半從控制台應用起步,printf輸出日誌直觀方便。但轉向MFC圖形介面專案後,預設無控制台窗口,除錯輸出變得麻煩。本文提供一組極簡封裝,讓MFC程式隨時建立/釋放控制台,並重導向標準輸出流,輕鬆實現printf除錯。
只需在對話框或視圖類中加入以下成員與方法:
// 必要頭文件
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
int hCrt = 0; // 控制台輸出句柄
// 建立控制台並重導向 stdout/stderr
void OnBnClickedButton1()
{
FreeConsole(); // 先釋放可能殘留的控制台
if (AllocConsole())
{
// 將系統標準輸出句柄轉為 C 執行期檔案描述符
hCrt = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
// 重導向 stdout 與 stderr 至無緩衝模式
*stdout = *::_fdopen(hCrt, "w");
::setvbuf(stdout, NULL, _IONBF, 0);
*stderr = *::_fdopen(hCrt, "w");
::setvbuf(stderr, NULL, _IONBF, 0);
}
}
// 釋放控制台
void OnBnClickedButton2()
{
FreeConsole();
}
// 測試輸出
void OnEnUpdateEdit1()
{
printf("hello MFConsole ");
}
FILE*,使printf、fprintf等標準函數直接生效。printf 即時觀察變數、流程走向。這段代碼精簡無依賴,複製即用,讓圖形介面專案也能享受控制台除錯的便利。