Nav*_*een 17
我不会说坏,因为这将取决于个人选择.我的策略是当C++中有类型安全的替代品时,使用它们会减少代码中的错误.
Eli*_*sky 15
这取决于哪些功能.define在C++中使用宏是非常不受欢迎的,并且有充分的理由.几乎总是可以用defineC++中更易于维护和安全的东西替换宏的使用(模板,内联函数等)
另一方面,Streams被一些人正确判断为非常慢,而且我已经看到很多有效且高质量的C++代码使用C FILE*代替它的主机.
还有一件事:对于过多的流格式化可能性,对于像简单的调试打印输出这样的东西,恕我直言,你只是无法击败其简洁的printf格式字符串.
我会说唯一对混合真正有害的是malloc/ free和new/ 之间的配对delete.
否则它真的是一种风格的东西......虽然C与C++兼容,但是当C++拥有你需要的所有内容而不退缩时,你为什么要混合使用这两种语言呢?
你绝对应该用printf它代替cout.后者确实允许您使大部分或全部格式化控件printf允许,但它以有状态的方式执行.即当前格式化模式存储为(全局)对象的一部分.这意味着错误的代码可能会留cout在后续输出格式错误的状态,除非您每次使用它时都重置所有格式.它还会对线程使用造成严重破坏.
对于大多数情况,有更好的解决方案,但不是全部.
例如,人们经常使用memcpy.我几乎不会这样做(除了真正的低级代码).我总是使用std::copy,即使是指针.
输入/输出例程的计数相同.但有时候,C风格printf比cout(特别是在日志记录中)更容易使用.如果Boost.Format不是一个选项那么肯定,使用C.
#define完全是一个不同的野兽.它不是真正的C-only功能,在C++中有许多合法用途.(但还有更多不是.)
当然,你永远不会用它来定义常量(这就是为什么const),也不是用来声明内联函数(使用inline和模板!).
另一方面,生成调试断言并且通常作为代码生成工具通常是有用的.例如,我是单元测试类模板而没有广泛使用宏,这将是*ss中真正的痛苦.在这里使用宏并不好,但它可以节省数千行代码.