2013-04-22 65 views
3

我正在做我的學校作業。在調試模式下,我想打開我的控制檯模式,並在發佈期間關閉控制檯。運行時間如何確定Visual Studio中的調試或發佈模式C++

我有嘗試marco按照推薦在stackoverflow但它不工作。我使用的Visual Studio 2012(空項目C++)

#if DEBUG 
//doing something 
#else 
//Release mode doing something 
#endif 
+0

它是如何工作的?你是否收到編譯時錯誤?它是否對發佈版本或調試版本做同樣的事情?什麼? – 2013-04-22 08:28:16

+0

不知道爲什麼。在我的DEBUG裏面包含了if(AllocConsole()) freopen(「CONOUT $」,「w」,stdout); – user2306421 2013-04-22 08:30:12

+0

我沒有任何編譯時錯誤。我是否必須在可視化項目中設置任何屬性? – user2306421 2013-04-22 08:35:30

回答

9

#if DEBUG如果通過編譯器選項定義DEBUG纔會工作。

默認情況下,DEBUG未定義,但_DEBUG是。嘗試#if defined(_DEBUG),或更改您的編譯器選項(通過項目屬性/配置屬性/ C/C++ /預處理器/預處理器定義)以定義DEBUG

+0

嗨,我試過定義(_DEBUG),但它仍然無法正常工作。 #if defined(DEBUG)|定義(_DEBUG) – user2306421 2013-04-22 10:19:02

+0

您能否解釋一些關於配置屬性的細節?我試圖讓DEBUG不會工作 – user2306421 2013-04-22 10:20:15

+0

我能想到的是DEBUG = 1;在配置屬性下。不知道是否正確的做法 – user2306421 2013-04-22 10:26:52

0

#if DEBUG將在編譯時自行解析,而不是在運行時解析。

NDEBUG是在發佈模式下定義的非常標準的宏。 而我認爲Visual Studio在調試模式下定義了_DEBUG宏。

在任何情況下,你可以在Visual Studio

轉到Project->Properties->Configuration Properties->C/C++->Preprocessor -> Preprocessor Definitions定義自己的宏在那裏,你可以在你所選擇的構建配置項目中添加宏。

0

從你的意見看來,你遇到的問題是獲得一個控制檯窗口打開並連接到stdout(與DEBUG與RELEASE構建沒有多大關係)。

查看MS支持文章INFO: Calling CRT Output Routines from a GUI Application爲如何有一個GUI程序打開控制檯,並直接stdout給它一個工作示例:

#include <stdio.h> 
#include <io.h> 
#include <fcntl.h> 

// ... 

int hCrt; 
FILE *hf; 

AllocConsole(); 
hCrt = _open_osfhandle(
    (long) GetStdHandle(STD_OUTPUT_HANDLE), 
    _O_TEXT 
    ); 
hf = _fdopen(hCrt, "w"); 
*stdout = *hf; 
int i = setvbuf(stdout, NULL, _IONBF, 0); 
puts("hello world"); 

其實,在進一步的測試,您的簡單使用freopen("CONOUT$","w",stdout);工程技術太。出於某種原因,在我最初的測試中,它似乎沒有工作。您可能還需要撥打setvbuf()以避免緩衝問題。

+0

感謝MichaelBurr告訴我緩衝區問題。 – user2306421 2013-04-23 03:32:29

-1

對於C#常量DEBUG工作正常,只要確保在項目屬性中啓用。

轉到項目屬性(通過在解決方案資源管理器中右鍵單擊您的項目),然後選擇窗口右側的構建選項並檢查定義的DEBUG常量複選框。

然後你可以使用這樣的代碼。

#if DEBUG 

// debug mode 

#else 

//release mode 

#endif 
+1

c#在哪裏? – marsh 2016-09-13 17:18:06

相關問題