然后在宏中定义Undefine预处理器变量

时间:2017-07-14 18:19:50

标签: c++ macros

我想创建一个类似下面的宏,它将用于创建两个函数:一个启用调试,另一个启用调试。

#define MakeDebuggerFunction(funName, funContents)\
    void funName() funContents\
    #define DEBUGGING\
    void funName ## _debugging() funContents\
    #undef DEBUGGING

使用它的方式如下:

MakeDebuggerFunction(DoWork,
    {
        std::cout << "Doing Work" << std::endl;
        #ifdef DEBUGGING
            std::cout << "Printing Verbose" << std::endl;
        #endif
    }
)

这将产生两个功能:DoWork和DoWork_debugging。两个函数都具有相同的准确性&#34; guts&#34;该函数的代码,但调试函数也会添加一些详细的打印。

我想要创建两个函数的原因是因为我的GUI应用程序具有&#34;开发人员模式&#34;当我不在办公室和现场与客户一起工作时,我可以使用这些服务,在那里我没有真正的调试环境。

这些函数中的许多函数处理强度也很高,所以我想避免像添加一个包含我的详细代码的永久if(DeveloperMode) {}语句那样做。

我将非常感谢我能得到的任何帮助/建议。

3 个答案:

答案 0 :(得分:1)

我认为这就是@Justin的建议

我会像这样制作我的包装函数:

void DoWork_Wrapper()
{
    if (DeveloperMode)
        DoWork(..., true);
    else
        DoWork(...., false);
}

并且worker函数将是:

void DoWork(..., bool DeveloperMode)
{
    /// do some stuff
    if (DeveloperMode)
        /// print verbose
}

所以当我调用DoWork(..., false)时,编译器已经优化了if语句?

答案 1 :(得分:0)

这样做怎么样?您可以使您的调试功能内联,它将完全透明。当然,您必须解决更复杂的调试消息并适当调整调试功能。这比复制你的功能要好得多。

void debug(string s) {
  if (DeveloperMode) {
    std::cout << s << "\n";
  }
}


 std::cout << "Doing Work" << std::endl;
 debug("Printing Verbose");

或者你可以使用其中一个looging库。例如。 Log4c。

答案 2 :(得分:0)

我不确定这是否正是您想要的,但是如果您可以编译一个版本并启用调试,而另一个版本没有您只需将一个DEBUGGING编译标志添加到调试版本并执行以下操作

#ifdef DEBUGGING
#define debugPrint(verboseMessage)            \
    std::cout << verboseMessage << std::endl;
#else
#define debugPrint(verboseMessage)
#endif

这将使你可以随时调用这个宏,如果打开调试它会实际打印你的消息,否则什么都不会发生。

HTH!