由变量控制的 C++ 调试宏

标签 c++ debugging variables macros

我正在编写一个 C++ 程序,我试图包含一个由宏控制的调试消息传递方法,该方法仅在创建拥有调试方法的对象时在运行时设置调试标志时调用。性能很重要,所以我尝试在不需要时不调用调试消息代码,而不是编译两个不同版本的程序,一个带有调试宏,另一个没有。

直到现在我一直在尝试这样的事情:

unsigned int flag = 0xFFFFFFFF;

if (flag != 0)
{
    #define DEBUG
}

#ifdef DEBUG
     debug("This is call 1 to the debug method");
#endif

#ifdef DEBUG
    debug("This is call 2 to the debug method");
#endif



debug(std::string message) 
{
    if ((flag && MASK_I_DEFINED_SOMEWHERE_FOR_STUFF) != 0)
    {
         std::cout << message << std::endl;
    }
}

我使用掩码仅在运行时的特定时刻或仅针对类的特定对象显示调试信息。一切似乎都正常,因为如果 flag 为 0,它不会输出任何消息,但我发现在定义 DEBUG 时 flag 的值无关紧要,这个程序总是定义 DEBUG。如果标志为 0,它不会打印任何内容,但无论如何都会调用调试方法并执行检查,这意味着性能不佳。

我还尝试使用类似以下示例的方法来保持我的代码结构:

#define FLAG flag

#if FLAG>0
    #define DEBUG
#endif

但在这种情况下,无论标志的值如何,#if 总是返回 false。

我什至尝试过:

const int flag2 = flag;
#define FLAG flag2

#if FLAG>0
    #define DEBUG
#endif

结果与上面的例子相同。 我的问题是:有没有一种方法可以根据变量的值定义宏?欢迎任何想法,但请记住,我想保留这种结构。否则,这将意味着更改数千行代码。

谢谢大家。

最佳答案

My question is: Is there a way of defining a macro depending on the value of a variable?

没有。您可以定义要替换为该变量的宏,但不能根据变量值定义或不定义宏。因为宏是在预编译期间求值的,所以所有宏都将在您运行程序之前不久定义或定义(换句话说,在您的变量被初始化并具有值之前很久)。

Any ideas are welcome, but please keep in mind that I would like to keep this structure. Otherwise it would mean changing thousands if lines of code.

试试这个:

unsigned int flag = 0xFFFFFFFF;

void debug(const std::string& message) // const & for efficiency
{
#ifdef DEBUG
    if ((flag && MASK_I_DEFINED_SOMEWHERE_FOR_STUFF) != 0)
    {
        std::cout << message << std::endl;
    }
#endif
}

当您定义了 DEBUG 宏时,将使用以下源代码编译此代码:

unsigned int flag = 0xFFFFFFFF;

void debug(const std::string& message) // const & for efficiency
{
    if ((flag && MASK_I_DEFINED_SOMEWHERE_FOR_STUFF) != 0)
    {
        std::cout << message << std::endl;
    }
}

当您没有定义宏时,将使用此源代码编译代码:

unsigned int flag = 0xFFFFFFFF;

void debug(const std::string& message) // const & for efficiency
{
}

或者,您可以定义日志记录宏以避免一起调用该函数:

#ifdef DEBUG
#    define DBGLOG(x) debug(x)
#else
#    define DBGLOG(x)
#endif

这样,当未定义 DEBUG 时,您所有的 DBGLOG 调用都将计算为空白源代码行(没有比这更有效的了)。

关于您的效率问题的说明:除非您有极端的效率要求,否则日志记录调用的性能应该无关紧要。要确定它们是否重要,首先设定一个目标(“我希望应用程序没有明显的滞后”、“我希望每秒处理 150 条消息”等),然后通过对应用程序施加压力来衡量性能(即运行测试部分 1000次左右,测量耗时,然后除以 1000),然后找出性能最差的问题,并对其进行优化。

在设置性能目标和衡量当前性能之前在代码级别(即不是体系结构或算法设计)优化性能是过早优化。 您在没有目标和衡量标准的情况下所做的任何优化工作(包括加速日志记录)很可能只会浪费开发时间。

关于由变量控制的 C++ 调试宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22714724/

相关文章:

C# 局部变量

function - 你如何在swift中访问函数外部的变量

Django 开发控制台自定义/调试消息

c# - 如何在 Visual Studio 2010 中查看调试输出?

c++ - 未知的模板函数返回类型,使用 decltype 时代码重复

c++ - 以下代码有什么问题?

c# - VS 2008 调试 : System. ArgumentException?

javascript - 插入 javascript 变量作为背景图像源

c++ - 为什么没有 std::from_string()?

C++ for-each 语句触发 "vector iterators incompatible"断言失败 : this->_Getcont() == 0