2

I am trying to setup a project with conditional debugging. What i want is to have a macro debug which is #defined to some kind of printf/cout/anything when I'm running in debug mode and #defined to null statement when running in production mode. How can I do this:

I have tried using the macro _DEBUG but I always see my arguments printing regardless of which mode I am running in:

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

In my main:

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int a=1,b=2,c=3;
    debug(a,b,c);
    cin>>a;
}

If it helps, I am using Visual studio 2012

4

2 回答 2

0

您的示例中的代码是正确的。问题是定义_DEBUG的来源。在正确的设置中,它应该来自/不来自您的 MSVC 项目,而不是来自其他任何地方。在这种情况下,根据构建类型,您将拥有您所期望的。

很可能您已在自己的代码或包含的标头之一中定义了它。

您的帖子中没有足够的信息来推断_DEBUG.

在调试模式下,来自 MSVC 的定义将如下所示:

#define _DEBUG

这意味着即使在 DEBUG 构建中,您也不应该看到任何东西。一旦你看到输出,这意味着 defn 存在并且它不是空的。此定义不是来自 MSVC。

于 2012-10-29T00:55:53.200 回答
0

尝试这个

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
于 2012-10-29T01:11:09.383 回答