0

我有个问题。在我的一个项目中,我使用 FLAG PRINT 来启用/禁用调试 printfs。目前我正在使用这样的东西。

#ifdef PRINT
    printf("DEBUG");
#endif 

将这个#ifdef 放在每个 printf 之前是很痛苦的。所以我想为#ifdef 有一个#define,比如

#define DEBUG_PRINT 
#define PRINT (#ifdef DEBUG_PRINT)
#define ENDPRINT #endif

这样我就可以使用 like

PRINT
   printf("DEBUG");
ENDPRINT

但它给出了编译器错误。你能告诉我以某种方式简化。

谢谢,

4

3 回答 3

2

一个标准的方法是

#ifdef DEBUG_PRINT
#  define is_debug() (1)
#else
#  define is_debug() (0)
#endif

#define pr_dbg(fmt, ...) do { \
        if (is_debug()) \
            printf(fmt, __VA_ARGS__); \
    } while (0)

使用 gcc 时,您可以/应该编写

            printf(fmt, ## __VA_ARGS__);

处理空参数。

在您的代码中,您可以编写

pr_dbg("foo=%u\n", foo);

优化器将在未定义时丢弃表达式,DEBUG_PRINT但仍将检查您的调试语句是否存在语法错误。#ifdef这避免了在子句中使用未定义的变量等情况下的静默破坏。

于 2013-11-14T21:44:12.570 回答
1

一个标题怎么样

#ifdef DEBUG
#define ON_DEBUG(X,...) do { X, __VA_ARGS__; } while( false )
#else
#define ON_DEBUG(X,...) do {} while( false )
#endif

在您的代码中,您只需使用

ON_DEBUG( printf("Hallo, %s", "Welt") );

do-while强制您添加最后一个分号并在 if (nested) - 语句的情况下保护语句if,请参阅 Aaron McDaid 的评论)

于 2013-11-14T21:43:52.653 回答
0

我实际上会以完全不同的方式来做。首先定义打开或关闭打印的标志:

// uncomment to turn off debug printing
#define DEBUG_PRINT 1

然后根据定义状态有条件地定义您的打印机宏DEBUG_PRINT

#ifdef DEBUG_PRINT
#define PRINT (X) (printf(x))
#else
#define PRINT (x)
#endif

可以简单地用作:

PRINT("foo");

但实际上,我根本不会做任何这些事情。相反,我有上面的开启/关闭标志,然后构建一个执行打印的

// comment out to not do debug printing
//#define DEBUG_PRINTING 1

#ifdef DEBUG_PRINTING
class Printer
{
public:
    Printer() {}
    ~Printer()
    {
        std::cout << mOutput.str() << "\n";
    }

    template <typename TYPE> Printer& operator<< (const TYPE& val)
    {
        mOutput << val;
        return * this;
    }
    template <size_t N> Printer& operator<<  (const char(&ary)[N])
    {
        mOutput << ary;
        return * this;
    }
private:
    std::stringstream mOutput;
};
#else
class Printer
{
public:
    Printer() {};
    template <typename TYPE> Printer& operator<< (const TYPE& val)
    {
        return * this;
    }
    template <size_t N> Printer& operator<< (const char(&ary)[N])
    {
        return * this;
    }
};
#endif

int main()
{
    Printer() << "My output here. " << 42;
}

在未定义标志的优化构建中,大部分(如果不是全部)代码将被优化掉。

于 2013-11-14T21:50:26.347 回答