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

例如printf而不是coutscanf而不是cin ,使用#define宏等?

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

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

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

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

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

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

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

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

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

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

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

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

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

对于分配,我会完全避免使用malloc / free并坚持使用new / delete。

不是真的, printf()cout快得多,而且c ++ iostream库非常大。 这取决于用户偏好或程序本身(是否需要?等)。 此外, scanf()不再适合使用,我更喜欢fgets()

可以使用或不仅仅取决于将使用的编译器。 由于您使用c ++编程,在我看来,为了最大化兼容性,最好使用c ++提供的代替c函数,除非您没有任何其他选择。

从一个稍微不同的角度来看,我会说在C中使用scanf很糟糕,更别提C ++了。 用户输入远远不变,可以使用scanf可靠地解析。

我只是发表评论到另一个回复,但因为我不能…因为国际化,C的printf()比C ++的iostream更好。 想要翻译字符串并将嵌入的数字放在不同的位置? 用ostream做不到。 printf()的格式规范本身就是一个完整的小语言,在运行时解释。