首页 > 解决方案 > 我可以避免包括如果我不使用它的功能?

问题描述

我想优化这段代码:

#include <iostream>

#define LOG if(true) {} else std::cerr

LOG << "test" << std::endl;

由于编译器不会忽略 else 块,并且需要<iostream>包含在内,因此我可以使用与 相比“更便宜”的函数std::cerr,包括与相比更简单的标头<iostream>吗?

标签: c++debuggingoptimizationc-preprocessoriostream

解决方案


这样的事情呢?

#ifdef DO_LOG
    #include <iostream>
    #define LOG std::cerr
#else
    class nullstr {};
    template<typename T>
    nullstr operator<<(nullstr s, T const&) { return s; }

    #define LOG if (false) nullstr()
#endif

下的代码if将被编译,但不会被执行。

然而,这个“空流”的实现相当糟糕,有一些问题(例如不能使用std::endl)。Boost 中有一个更好的实现,但我怀疑为这样一个简单的功能引入 Boost 是否有意义。


推荐阅读