我知道目前的C++中没有线程的概念,但是thisarticleissaying:Atypesafe,threadsafe,portableloggingmechanism.....Thefprintf()functionisthreadsafe,soevenifthislogisusedfromdifferentthreads,theoutputlineswon'tbescrambled.cout、cerr和clog呢?我认为这个问题也适用于C++中的所有流类型,例如fstream和stringstream。 最佳答案 文章声明了f
这个问题在这里已经有了答案:Whatisthedifferencebetweencout,cerr,clogofiostreamheaderinc++?Whentousewhichone?(7个答案)关闭7年前。谁能解释一下cerrcout和clog之间的区别以及为什么会提出不同的对象?我知道区别如下:1)cout可以重定向但是cerr不能2)clog可以使用buffer。我对第2点感到困惑,如果有人可以详细说明,我将不胜感激。
我理解为避免输出混合,多个线程对cout和cerr的访问必须同步。在同时使用cout和cerr的程序中,单独锁定它们是否足够?还是同时写入cout和cerr仍然不安全?编辑说明:我知道cout和cerr在C++11中是“线程安全的”。我的问题是不同线程同时写入cout和写入cerr是否会像两次写入cout那样相互干扰(导致交错输入等)。 最佳答案 如果你执行这个函数:voidf(){std::cout从多个线程中,您将获得两个字符串的或多或少的随机交错,"Hello,"和"world\n"。那是因为有两个函数调用,就好像你写了这样的
在下面描述的情况下使用cerr是否有良好的风格?try{cout还是应该用cout?请参阅代码中的注释。 最佳答案 stderr是发送错误消息的传统流(这样OS/shell/任何东西都可以从“正常”输出中单独捕获错误消息),所以是的,使用std::对了!对于简单地捕获异常并打印出来是否比简单地让异常传播到您的应用程序之外更好,我不做任何评论... 关于c++-我应该使用cerr,我们在StackOverflow上找到一个类似的问题: https://stack
上下文我为用户编写了一个记录器打印消息。级别为“debug”、“info”或“warning”的消息打印在std::cout中,级别为“error”或“system_error”的消息打印在std::cerr。我的程序不是多线程的。我在LinuxopenSUSE12.3下使用gcc4.7.2和CMake3.1.0工作。我的问题我发现有时,当一条错误消息(打印在std::cerr中)跟在一条长信息消息(打印在std::cout中)之后,并且当输出被CTest重定向到文件LastTest.log,错误消息出现在信息消息中(看下面的例子)。我不太了解这种行为,但我想为std::cout启动了
上下文我为用户编写了一个记录器打印消息。级别为“debug”、“info”或“warning”的消息打印在std::cout中,级别为“error”或“system_error”的消息打印在std::cerr。我的程序不是多线程的。我在LinuxopenSUSE12.3下使用gcc4.7.2和CMake3.1.0工作。我的问题我发现有时,当一条错误消息(打印在std::cerr中)跟在一条长信息消息(打印在std::cout中)之后,并且当输出被CTest重定向到文件LastTest.log,错误消息出现在信息消息中(看下面的例子)。我不太了解这种行为,但我想为std::cout启动了
这样使用std::cerr安全吗?try{Something();}catch(std::bad_alloc){cerr它是否使用动态内存?如果失败,它会抛出异常还是什么都不输出? 最佳答案 简单案例有一个失败的大分配-可能是由于程序员的错误-intmain(){try{std::size_tbytesToAllocate;std::cin>>bytesToAllocate;std::unique_ptrptr{newchar[bytesToAllocate-1]};//ops,ifuserenters0orextractionfa
我有一些问题,我收到了这些错误(在代码中标记):标识符“cerr”未定义没有运算符“为什么?#include"basic.h"#includeusingnamespacestd;intmain(){ofstreamoutput("output.txt",ios::out);if(output==NULL){cerr 最佳答案 您必须包含iostream才能使用cerr。参见http://en.cppreference.com/w/cpp/io/basic_ostream. 关于c++-c
我遇到了一段基本上执行以下操作的代码:#includeusingnamespacestd;intmain(){cout输出:0x601088Hi.首先,为什么有人会做'cout值得一提的是,在我的机器上,上面的代码编译和执行没有错误。然而,在运行相同版本的gcc5.4.0的不同机器(服务器ssh连接)上的更复杂的代码(做与上面相同的事情)在执行make时会产生此错误(为清楚起见缩短):error:nomatchfor‘operator}’and‘std::ostream{akastd::basic_ostream}’)cout对此有什么想法吗? 最佳答案
我有通过cout和cerr写入控制台的OpenMP线程。这当然是不安全的,因为输出可以交错。我可以做类似的事情#pragmaompcritical(cerr){cerr如果可以将cerr替换为线程安全版本会更好,类似于valgrindDRD手册(http://valgrind.org/docs/manual/drd-manual.html#drd-manual.effective-use)中解释的方法,该方法涉及从std::ostreambuf派生一个类。理想情况下,最后我会用我自己的线程cerr替换cerr,例如简单地说:tcerr这样的类可以在遇到“endl”时立即打印到控制台。我