2013-04-22 6 views
3

Я выполняю свое школьное задание. Во время режима отладки я хотел бы включить режим консоли и во время выпуска отключить консоль.Runtime как определить режим отладки или выпуска в visual studio C++

Я попытался marco, как рекомендовано в stackoverflow, но он не работает. Я использую Visual Studio 2012 (пустой проект C++)

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

Как это работает? Вы получаете ошибку времени компиляции? Это делает то же самое для выпуска или сборки отладки? Какие? –

+0

Не знаете, почему. Внутри моей DEBUG, что включает, если (AllocConsole()) freopen («CONOUT $», «w», stdout); – user2306421

+0

У меня нет ошибки времени компиляции. Должен ли я устанавливать какие-либо свойства внутри визуального проекта или что-то еще? – user2306421

ответ

9

#if DEBUG будет работать только если вы определите DEBUG с помощью опции компилятора.

По умолчанию DEBUG не определен, но _DEBUG есть. Попробуйте #if defined(_DEBUG) или измените параметры вашего компилятора (через Свойства проекта/Свойства конфигурации/C/C++/Препроцессор/Определения препроцессора), чтобы определить DEBUG.

+0

Привет, я пробовал определенный (_DEBUG), но он все еще не работает. #if defined (DEBUG) | defined (_DEBUG) – user2306421

+0

Не могли бы вы немного подробнее рассказать о свойствах конфигурации. Я стараюсь, чтобы DEBUG не работал – user2306421

+0

Что я могу думать о DEBUG = 1; под свойствами конфигурации.Не уверен, что это правильный способ. – user2306421

0

#if DEBUG будет решать себя во время компиляции не во время выполнения.

NDEBUG довольно стандартный макрос, определенный в режиме деблокирования. И я думаю, что Visual studio определяет _DEBUG макрос в режиме отладки.

В любом случае вы можете определить свои собственные макросы в Visual Studio

Перейти к Project->Properties->Configuration Properties->C/C++->Preprocessor -> Preprocessor Definitions Там вы можете добавлять макросы для вашего проекта в конфигурации сборки вы выбрали.

0

Из ваших комментариев кажется, что tproblem, с которым вы работаете, открывает окно консоли и подключается к 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

-1

Для C# константы DEBUG отлично работают, просто убедитесь, что в свойствах проекта он включен.

Перейдите к объекту проекта (щелкнув правой кнопкой мыши по проекту в проводнике решений), затем выберите вариант сборки в правой части окна и установите флажок define DEBUG constant.

Тогда вы можете использовать код, подобный этому.

#if DEBUG 

// debug mode 

#else 

//release mode 

#endif 
+1

Где C# входит в это? – marsh

 Смежные вопросы

  • Нет связанных вопросов^_^