printf
,则可以访问 #include <stdio.h>
。由于格式说明符,我喜欢使用printf
,而且感觉比做std::cout << "something\n";
更好。
#include <stdio.h>
#include <cstdlib> // to use rand()
int main() {
int randNum = rand()%10 + 1;
printf("Hey, we got %d!\n", randNum);
return 0;
}
vs
#include <iostream>
#include <cstdlib> // to use rand()
using std::cout;
int main() {
int randNum = rand()%10 + 1;
cout << "Hey, we got " << randNum << "!\n";
return 0;
}
但是我所在的不和谐服务器上的用户说这是不正确的做法,因为“ printf不安全,请使用std :: cout”。
第二位用户说这很不好,因为它不是类型安全的(第一位用户确实提到了类型安全,但没有深入探讨)。
第二个用户说,
Typesafety由编译器强制执行。但是,通过使用可变参数函数,编译器无法在运行时告诉参数的类型;它无法提前知道他们。该函数需要某种方式来说明期望的参数类型,而
printf
C函数家族通过格式字符串说明符完成了此操作。
所以我正在寻找其他选择。
如果没有,我想我会坚持std::cout
答案 0 :(得分:5)
GNU C ++编译器g++
在编译时检查printf
参数。如果在命令行上指定-Wall
,则它会在检测到不匹配时发出警告。因此,如果您使用的是此编译器,则可以使用printf
而不用担心。
您的编译器可能会或可能不会提供类似的服务。但是,无论如何,至少应使用printf
,至少要优先于荒谬的cout
机制。或者,对于类型安全的解决方案,您可以考虑使用Boost Format library。
编辑后添加: This question进行了一个您可能会感兴趣的讨论。
答案 1 :(得分:-3)
正如@TonyK所解释的那样,snprintf
和sprintf
用于写入缓冲区而不是标准流。这不只是回答特定问题,而是解释了更广泛的解决方案。
要获得“更安全”的功能,可以使用snprintf
,其中明确指定了对象的大小。
在不指定大小且未使用printf
的情况下,您必须“相信”所提供的char*
是有效的C字符串,其终止符为空字符,否则printf
将继续读取记忆。
通常来说,如果要求仅使用C且仅对关联的C运行时库(Linux上的glibc,Windows上的msvcrt / ucrt等)具有依赖性,则仅使用C标头并使用C编译器很有意义。
如果可以选择使用C ++,那么使用std::cout
是自然的选择,因为它将支持显示实现ostream::operator<<
的任何对象。
最佳选择的答案将取决于您尝试实现的目标。