许多C++书籍都包含这样的示例代码......
std::cout << "Test line" << std::endl;
Run Code Online (Sandbox Code Playgroud)
......所以我也一直这样做.但我已经看到很多来自像这样的开发人员的代码:
std::cout << "Test line\n";
Run Code Online (Sandbox Code Playgroud)
是否有技术上的理由偏爱另一个,或者仅仅是编码风格的问题?
在这个答案中,我们可以看到:
我猜想using
'\n'或using 之间没有什么区别"\n",但是后者是一个(两个)字符的数组,必须逐个字符地打印,为此必须建立一个循环,这比输出单个字符更为复杂。。
重点矿
这对我来说很有意义。我认为,输出const char*需要一个循环,这将测试空终止符,其必须推出比更多的操作,比方说,一个简单的putchar(不是暗示std::cout与char代表们呼吁-它只是引进一个实例的简化)。
说服我使用
std::cout << '\n';
std::cout << ' ';
Run Code Online (Sandbox Code Playgroud)
而不是
std::cout << "\n";
std::cout << " ";
Run Code Online (Sandbox Code Playgroud)
在这里值得一提的是,我知道性能差异几乎可以忽略不计。但是,有些人可能会争辩说,前一种方法的意图是实际上传递单个字符,而不是恰好是一个char长字符(如果算上是2 char s '\0')的字符串文字。
最近,我为使用后一种方法的人做了一些代码修改。我对此案发表了一点评论,然后继续。然后,开发人员感谢我,并说他甚至都没有想到这种差异(主要集中在意图上)。完全没有影响(毫不奇怪),但是采用了更改。
然后,我开始怀疑这种变化到底有多重要,所以我狂奔。令我惊讶的是,当在带有标志的GCC(树干)上进行测试时,它显示出以下结果-std=c++17 -O3。为以下代码生成的程序集:
#include <iostream>
void str() {
std::cout << "\n";
}
void chr() {
std::cout << '\n';
}
int main() {
str();
chr();
}
Run Code Online (Sandbox Code Playgroud)
我很惊讶,因为看起来chr() …
使用逗号分隔的参数包的最简单方法是什么std::ostream?
例:
template<typename... Args>
void doPrint(std::ostream& out, Args... args){
out << args...; // WRONG! What to write here?
}
// Usage:
int main(){
doPrint(std::cout,34,"bla",15); // Should print: 34,bla,15
}
Run Code Online (Sandbox Code Playgroud)
注意:可以假设<<操作员的相应过载可用于所有类型的参数包.
我目前正在编写一个记录器类,但该operator<<方法会导致编译器错误.这是类的最小化版本,在文件"logger.h"中:
#include <iostream>
class Logger {
public:
Logger() : m_file(std::cout) {}
template <typename T>
Logger &operator<<(const T &a) {
m_file<<a;
return *this;
}
protected:
std::ostream& m_file;
};
Run Code Online (Sandbox Code Playgroud)
它包含在我的main.cpp中,并在输出字符串文字时完美地工作:
log << "hi";
Run Code Online (Sandbox Code Playgroud)
但是,以下内容无法编译.
#include "logger.h"
int main() {
Logger log;
log << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
g ++编译器报告:
src/main.cpp:5:错误:'log << std :: endl'中'operator <<'不匹配
c++ ×4
c++-faq ×1
c++11 ×1
chaining ×1
coding-style ×1
cout ×1
iostream ×1
operators ×1
performance ×1
templates ×1