visual MSVC c++编译器选项,以防止在ostream/ofstream中用CR LF替换LF



我正在使用Microsoft Visual Studio 2017的命令行工具,如cl.exe来编译c++代码。

输出像

这样的换行符的指令
std::cout << "abc" << std::endl;

std::cout << "abc" << 'n';

printf("abcn");

导致"abcrn"而不是"abcn"。如何更改此行为以获得"abcn"输出?

如果可能的话,我希望它能够实现,而不需要对核心c++源代码进行大的更改,比如添加"二进制模式"。在任何地方创建输出流的标志。(我已经有一个相对较大的c++项目,它与GCC很好,并试图用MSVC构建它)

在标准c++中没有办法实现这一点。显然,没有办法通过特定于实现的文档化函数来实现这一点。如果可能的话,它将依赖于实现细节。


你可以钩子CRT函数fopen,_wfopen,fopen_s,wfopen_s,在钩子函数你会改变打开模式。c++流内部也使用这些函数。

具体怎么做取决于你是静态链接CRT还是动态链接CRT,以及你使用的是哪个版本的Visual Studio。

我希望它能够实现,而不需要对核心c++源代码进行大的更改,比如添加"二进制模式";在任何地方创建输出流的标志。

除了修复你的错误代码没有正确的方法。不应该有很多地方打开文件,所以只需手动修复。你不会一次打开成千上万的文件吧?

也就是说,如果你真的想在c++流中到处使用LF,那么微软STL是开源的。您可以下载STL,对其进行修补并使用该STL,而不是MSVC中的发布版本。C标准库不是开源的,所以你必须手动修复C部分,如果有任何

然而,即使你修补了STL,源代码或输出二进制文件,使其始终使用LF而不是CRLF,那么许多其他功能将失败,例如控制台输出将无法正常工作。这也是非常脆弱的,因为未来添加的新代码或新的3类库可能会因为不期望LF而崩溃,所以要小心

我已经有了一个比较大的c++项目,可以用GCC,并试图用MSVC构建它

行结束与编译器无关。即使您在Windows上使用GCC构建,它仍然会使用CRLF。它是一个平台属性

你可以通过_setmode来防止这种情况,你可以在程序开始时调用它(注意全局构造函数可能已经打印了一些东西):

#ifdef _WIN32
#include <fcntl.h>
#include <io.h>
#endif
int main() {
#ifdef _WIN32
_setmode(_fileno(stdout), _O_BINARY);
#endif
// ...
}

相关内容

  • 没有找到相关文章