繁体   English   中英

不知何故告诉编译器“不要处理代码行”

[英]Somehow tell compiler to “Do not process line of code”

我正在尝试为调试日志记录创建一个宏。 这是一个额外的简化版本:

#if defined _DEBUG
#define LOG std::cout
#else
#define LOG IGNORETHISLINEOFCODE
#endif

/* ... */

LOG << "Here's some debug code";

我一直在想我可以告诉编译器忽略以“LOG”开头的这行代码的方法。 我个人并不寻找替代方法,例如#define LOG( ... ) (void)0 这是我尝试过的:

  • 将lefthift操作符重载为void,作为内联constexpr,什么都不做(这仍然导致它在反汇编中可见;我不希望这样)

  • 将LOG定义为: #define LOG // ,但注释标识符未替换

有任何想法吗? 就像我之前说的那样,我不想要任何替代方案,例如用#if defined _DEBUG包围所有日志代码

如果您的C ++版本处理if constexpr我会根据您的要求来了解这一行。

#include <iostream>

template <bool Log>
struct LOGGER {
    template <typename T>
    LOGGER& operator<<(T const &t) {
        if constexpr (Log)
            std::cout << t;
        return *this;
    }
};

LOGGER<false> LOG;

int main (int argc, char const* argv[])
{
    LOG << "A log statement." << '\n';
    return 0;
}

你的问题和约束( “我不想要任何替代方案” )非常具体。

我一直在想我可以告诉编译器忽略以“LOG”开头的这行代码的方法

不要这样做,它将被多线日志声明轻易打破。 任何可能因合法重新格式化而突然中断的代码最好避免。

接下来我们有

...仍然导致它在拆卸中可见...

如果代码真的死了,你有一个不错的编译器,你打开优化,这不应该是真的。 不过,这仍然是一些工作。

通常的解决方案是这样的

#ifdef NDEBUG
#define LOG(EXPR)
#else
#define LOG(EXPR) std::cerr << EXPR
#endif

一个替代方案,但它不是一个替代方案, 例如用#if defined所有日志代码 ,所以我不知道它是否适合你。

它确实具有在任何优化级别上真正编译为空的优点。

另一种基于编译器优化能力的可能性:

#define LOG if (DEBUG) std::cout

现在你可以使用了

#define DEBUG false
LOG << "hello " << " world 1" << endl;

你应该能够使用const bool DEBUG = false

#if defined _DEBUG
#define LOG std::cout
#else
#define LOG /##/
#endif

这也有效。 这是原始问题的答案,所以我会将其标记为这样,但只知道这不支持多行操作。

我想你可以为多行操作做类似的事情。 我不知道它有多好用。

#if defined _DEBUG
#define LOG( in ) std::cout << in
#else
#define LOG( in ) /##/
#endif

更好的逻辑是定义跟踪器策略,您可以在应用程序启动时设置日志记录级别,然后使用跟踪级别来决定是否记录degug信息。 跟踪级别可以定义为枚举

enum Tracelevel{CRITICAL, ERROR, INFO, TEST, DEBUG};

setTraceLevel(TraceLevel trcLvl){
    _traceLevel = trcLvl;
};

#if defined _DEBUG
if(_traceLevel  == DEBUG) {\
#define LOG std::cout
}
#endif

可以找到一个轻量级记录器http://www.drdobbs.com/cpp/a-lightweight-logger-for-c/240147505?pgno=1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM