Я пытаюсь настроить проект с условной отладкой. Я хочу иметь макрос debug
который #defined для некоторого вида printf / cout / что угодно, когда я работаю в режиме отладки и #defined для пустого оператора при работе в производственном режиме. Как я могу это сделать:
Я пробовал использовать макрос _DEBUG
но я всегда вижу печать своих аргументов независимо от того, в каком режиме я работаю:
struct debugger{template<typename T> debugger& operator ,(const T& v){std::cerr<<v<<" ";return *this;}}dbg;
#if _DEBUG
#define debug(...) {dbg,__VA_ARGS__;std::cerr<<std::endl;}
#else
#define debug(...) // Just strip off all debug tokens
#endif
В моем основном:
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int a=1,b=2,c=3;
debug(a,b,c);
cin>>a;
}
Если это поможет, я использую Visual Studio 2012
Код в ваших примерах правильный. Проблема в том, где определение _DEBUG
идет от. В правильной настройке он должен прийти / не исходить из вашего проекта MSVC и из ниоткуда. В этом случае в зависимости от типа сборки у вас будет то, что вы ожидаете.
Скорее всего, он определен где-то в вашем собственном коде или в одном из заголовков, которые вы включаете.
В вашем сообщении недостаточно информации, чтобы определить истинное происхождение _DEBUG
,
В режиме отладки определение из MSVC будет выглядеть так:
#define _DEBUG
Это значит, что даже в DEBUG build вы ничего не увидите. Когда вы видите результат, это означает, что defn присутствует и он не пустой. Это определение не из MSVC.
Попробуй это
struct debugger{template<typename T> debugger& operator ,(const T& v){std::cerr<<v<<" ";return *this;}}dbg;
#if _DEBUG
#define debug(...) {dbg,__VA_ARGS__;std::cerr<<std::endl;}
#else
#define debug
#endif