c++ ifdef用于重复行
C++ ifdef for repeated lines
我有许多printfs我想注释掉,并能够以灵活的方式再次取消注释。我正在考虑这样的解决方案:
#define SOMETHING
...
#ifdef SOMETHING
printf(....
#endif
但缺点是每次打印都要这样做。第一个问题,有人知道更有效的方法吗?如果是的话,请给出一些片段作为示例,因为我是预处理器和宏定义的初学者。第二个问题,我能对计数做同样的事情吗?如果不能,它们的解决方案是什么?
您可以使用一个简单的宏来完成此操作,该宏允许您完全删除printf
语句。
#ifdef PRINT_DATA
#define PRINT(x) printf x
#else
#define PRINT(x)
#endif
void test()
{
PRINT(("Entering testn"));
}
除了标题明显的答案,因为你问的是std::cout
:是的,这是可能的,但是,因为你会使用<<
操作符,你必须提供一个特殊的nullstream,它只是忽略每个输入:
#ifdef PRINT_DATA
#define OUT std::cout
#else
#include <iosfwd>
struct nullstream_t{};
template <typename T>
nullstream_t & operator<<(nullstream_t & s, T const &){return s;}
nullstream_t & operator<<(nullstream_t & s, std::ostream &(std::ostream&)){
return s;
}
static nullstream_t nullstream;
#define OUT nullstream
#endif
#include <iostream>
int main(){
OUT << "Hello World" << std::endl;
}
这个想法仍然是一样的,你定义一个宏,要么定义到std::cout
或一个空流。
有选择地记录事情是许多人都面临的问题;与其推出自己的解决方案,并随着需求的变化而慢慢扩展它,不如考虑使用现有的实现,比如Boost.Log,它有很多你现在可能不需要的功能,但将来可能会用到。
对于你关于cout的问题,我是这样用的:
#define verbose
//or
bool verbose = true;
//Verbose Output
#define VOUT(str) do { if (verbose) { std::cout << str; } } while (0,0)
(0,0)
用于避免Visual Studio上的一些编译器警告。使用VOUT看起来像这样:
int i = 5;
VOUT("Hello world " << i << 'n');
//'Hello world 5
//'
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- #ifdef和未声明的标识符
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 用于矢量处理的多个线程
- 什么是通用运行时组件 #ifdef 适用于Windows(UWP)而不是iOS
- "#ifdef"防护的替代方法,用于抑制对特定类的调用
- 宏调用中的 #ifdef 适用于 GCC,但不适用于 MSVC
- 处理用于创建算法的多个版本的 #ifdef
- c++ ifdef用于重复行