如果我不使用它的功能,我可以避免包含 <iostream> 吗?
Can I avoid to include <iostream> if I do not use its functions?
我想优化这段代码:
#include <iostream>
#define LOG if(true) {} else std::cerr
LOG << "test" << std::endl;
由于编译器不会忽略 else 块,并且需要包含 <iostream>
,与 std::cerr
相比,我可以使用 "cheaper" 函数吗? <iostream>
?
这样的事情怎么样?
#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
下的代码会被编译,但不会执行。
这个 "null stream" 实现得相当糟糕,但有一些问题(例如不能使用 std::endl
)。 Boost 中有一个更好的实现,但我怀疑为这样一个简单的功能引入 Boost 是否有意义。
Can I avoid to include if I do not use its functions?
没有。不使用函数是不够的。
除此之外,不能使用函数,也不能使用变量(如std::cerr
)、模板和类型等其他声明。此外,在此上下文中,"using" 表示任何提及声明的标识符 - 仅仅因为在运行时不会采用特定分支并不意味着代码不需要格式正确。一些模板在 <iosfwd>
中声明,因此可以在不包括它们的定义的情况下以有限的方式使用。
I would like to optimise this code:
您的程序没有运行时行为,因此您可以将其优化为:
// nothing
我想优化这段代码:
#include <iostream>
#define LOG if(true) {} else std::cerr
LOG << "test" << std::endl;
由于编译器不会忽略 else 块,并且需要包含 <iostream>
,与 std::cerr
相比,我可以使用 "cheaper" 函数吗? <iostream>
?
这样的事情怎么样?
#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
下的代码会被编译,但不会执行。
这个 "null stream" 实现得相当糟糕,但有一些问题(例如不能使用 std::endl
)。 Boost 中有一个更好的实现,但我怀疑为这样一个简单的功能引入 Boost 是否有意义。
Can I avoid to include if I do not use its functions?
没有。不使用函数是不够的。
除此之外,不能使用函数,也不能使用变量(如std::cerr
)、模板和类型等其他声明。此外,在此上下文中,"using" 表示任何提及声明的标识符 - 仅仅因为在运行时不会采用特定分支并不意味着代码不需要格式正确。一些模板在 <iosfwd>
中声明,因此可以在不包括它们的定义的情况下以有限的方式使用。
I would like to optimise this code:
您的程序没有运行时行为,因此您可以将其优化为:
// nothing