在c+;中打印到控制台的最佳方式是什么+;? 我已经阅读了三种方法,可以从各种来源在C++中向控制台打印东西。p> 使用使用名称空间std然后使用cout(代码块标准) 不使用上述内容,并使用std::cout和std::endl(C++入门) 使用printf(HackerRank)
首选哪一种?为什么?您的第一点做的基本相同。最好使用在c+;中打印到控制台的最佳方式是什么+;? 我已经阅读了三种方法,可以从各种来源在C++中向控制台打印东西。p> 使用使用名称空间std然后使用cout(代码块标准) 不使用上述内容,并使用std::cout和std::endl(C++入门) 使用printf(HackerRank),c++,C++,首选哪一种?为什么?您的第一点做的基本相同。最好使用std::而不是使用名称空间std代码>。大量的Entl可以使代码变慢。使用 CUT> P>这是我的调试器代码,在C++工作的10年中帮助了我。 std::ostream &debugRecord (const char* fileName, int lineNum, const char* funcName) { std::lock_guard<std::mutex> lock(streamMutex_);
std::
而不是使用名称空间std因为后者会污染全局名称空间并可能导致命名冲突
没有提到的是,您可以通过使用::;有选择地公开命名空间的一部分代码>(例如使用std::cout;
)。更好的做法是使用冗长的语句,但是这个选项仍然没有公开整个名称空间那么糟糕
printf
不如cout
安全(流第2号,经过修改。(std::cout
和'\n'
)
为什么?
因为您应该避免使用命名空间std
(除其他原因外)因为cout
是类型安全的,而printf
不是
std::endl
将强制将输出缓冲区刷新到控制台。除非您特别希望这样做,否则请使用除非您真正关心速度,否则cout和printf都可以。如果您希望更快的运行时,以下是几点提示:
- 只使用printf而不使用cout。这将比混合使用printf和cout或just cout提供更高的速度
- 或者只使用cout,但在执行开始时添加以下内容
ios\u base::与stdio同步(false);cin.tie(NULL);
。printf和cout有两个单独的流,默认情况下它们是同步的。由于这种同步,浪费了大量的运行时间。这两行代码将停止同步,但请注意,如果添加这些行,请不要使用任何printf,否则打印可能会以随机顺序进行
- 除非使用刷新代码,否则不要使用<代码> EntL>代码>。大量的Entl可以使代码变慢。使用<代码> CUT> P>这是我的调试器代码,在C++工作的10年中帮助了我。
std::ostream &debugRecord (const char* fileName, int lineNum, const char* funcName)
{
std::lock_guard<std::mutex> lock(streamMutex_);
return std::cout << "Thread # " << getCurrentThreadId() << " -- "
<< "(" << fileName << ":" << lineNum << "): " << funcName << std::endl;
}
std::ostream&debugRecord(const char*fileName,int lineNum,const char*funcName)
{
std::lock_guard lock(流互斥锁);
return std::cout答案在很大程度上取决于您想要做什么。对于主要使用默认格式的输出,由于类型安全性和直观性,确实首选cout
如果你想大量格式化你的输出,尽管我只能推荐令人惊讶的多功能和直接的printf
,因为cout中的操纵器很麻烦。没错:printf
格式语法确实需要一些时间来适应,但它肯定是值得的。只需仔细检查格式字符串,听听w了解您的编译器,并使用适当的格式说明符,例如用于size\t
和其他依赖于系统的数据,以保持可移植性
还有一个用于组合流和代码> PrtufF格式化的升力工具,请参阅,但我从来没有使用过它。也许有人可以评论它的可用性。
1和2都是相同的。使用<代码> Prtff<代码>不是类型安全的。请重复,请漂亮,不要尝试从HACKERAKAN.THA学习C++。t将非常糟糕。另请参见:由于名称空间污染,在全局范围内使用使用名称空间std
是不好的做法(请参见)特别是作为初学者,我建议不要每次都使用使用名称空间std;
并指定std::
,只是为了习惯阅读这样的代码。但正如您所说的,它可能会变得非常固执己见。@AlexMeuer在名称空间范围的标题中放置使用名称空间…
,这几乎被普遍认为是错误的不过,Practice在这里更具体一点。printf对我来说做得不太好,让我感到困惑,所以我用cout做了它并得到了很好的结果。此外,您还应该提到您使用的并发API需要哪些头(getCurrentThreadId()
来自哪里?)getCurrentThreadId()是我以前写过的函数。但是如果你需要它,请告诉我在这里为你写。不,没有必要;但是你应该在回答中提到这一点,并让它清楚地表明你的代码只是一个建议或模板,没有任何东西可以直接复制和粘贴。尽管OP的问题可能更一般,但我还是喜欢它。你为什么使用std::cout
进行调试,而不是std::clog
(它正是为此目的提供的)?您真的不希望日志记录与程序输出混淆!如果您想要速度,请不要打印。写入文件。