在C++中使用C功能是不好的做法吗?

Gus*_*uma 18 c c++ language-features

例如printf代替cout,scanf而不是cin使用#define宏,等?

Nav*_*een 17

我不会说坏,因为这将取决于个人选择.我的策略是当C++中有类型安全的替代品时,使用它们会减少代码中的错误.

  • 如果函数接受`void*`参数,或返回`void*`结果,那么它可能不是类型安全的.具有可变参数列表的函数(如`printf`)通常也不是类型安全的.任何时候你必须使用`sizeof`,代码可能不是类型安全的. (9认同)

Eli*_*sky 15

这取决于哪些功能.define在C++中使用宏是非常不受欢迎的,并且有充分的理由.几乎总是可以用defineC++中更易于维护和安全的东西替换宏的使用(模板,内联函数等)

另一方面,Streams被一些人正确判断为非常慢,而且我已经看到很多有效且高质量的C++代码使用C FILE*代替它的主机.

还有一件事:对于过多的流格式化可能性,对于像简单的调试打印输出这样的东西,恕我直言,你只是无法击败其简洁的printf格式字符串.

  • 取决于使用.Boost(普遍认为是C++的最佳库集合)使用宏丰富. (4认同)
  • 承认C部分的+1仍然闪耀 (3认同)

Jus*_*ner 8

我会说唯一对混合真正有害的是malloc/ freenew/ 之间的配对delete.

否则它真的是一种风格的东西......虽然C与C++兼容,但是当C++拥有你需要的所有内容而不退缩时,你为什么要混合使用这两种语言呢?

  • printf为您提供了一种精确格式化输出的机制,这是我在cout中找不到的. (7认同)
  • cout允许您精确地格式化输出.但是,完成它的cout方式往往比printf方式复杂得多(反之亦然). (6认同)
  • @crypto - cout提供格式化选项:http://www.arachnoid.com/cpptutor/student3.html (3认同)

R..*_*R.. 8

你绝对应该用printf它代替cout.后者确实允许您使大部分或全部格式化控件printf允许,但它以有状态的方式执行.即当前格式化模式存储为(全局)对象的一部分.这意味着错误的代码可能会留cout在后续输出格式错误的状态,除非您每次使用它时都重置所有格式.它还会对线程使用造成严重破坏.

  • +1,我完全同意.使用副作用编程是邪恶的,这里是一个图书馆标准强加这种不良行为:-( (2认同)

Kon*_*lph 7

对于大多数情况,有更好的解决方案,但不是全部.

例如,人们经常使用memcpy.我几乎不会这样做(除了真正的低级代码).我总是使用std::copy,即使是指针.

输入/输出例程的计数相同.但有时候,C风格printfcout(特别是在日志记录中)更容易使用.如果Boost.Format不是一个选项那么肯定,使用C.

#define完全是一个不同的野兽.它不是真正的C-only功能,在C++中有许多合法用途.(但还有更多不是.)

当然,你永远不会用它来定义常量(这就是为什么const),也不是用来声明内联函数(使用inline和模板!).

另一方面,生成调试断言并且通常作为代码生成工具通常是有用的.例如,我是单元测试类模板而没有广泛使用宏,这将是*ss中真正的痛苦.在这里使用宏并不好,但它可以节省数千行代码.