MSVC编译C++时如何无需修改核心代码即可阻止LF被替换为CRLF
MSVC编译C++项目全局统一LF换行符的无侵入配置方案
问题本质
MSVC的C运行时默认所有I/O流(包括标准输出std::cout/stdout、标准错误、普通文件流)默认以文本模式运行,输出时会自动将\n转换为\r\n,该转换是运行时底层逻辑,和上层输出语句的写法无关。
可用解决方案(按适配成本从低到高排序)
方案1:仅添加编译宏(完全无代码修改)
VS2015及更高版本(包含你使用的VS2017)支持全局CRT模式配置宏,直接在编译参数中添加定义即可:
- cl命令行编译时添加参数:
/D _CRT_STDIO_BINARY_MODE - Visual Studio IDE中配置路径:项目属性→C/C++→预处理器→预处理器定义,添加
_CRT_STDIO_BINARY_MODE后重新编译即可
该配置生效后,所有标准流、通过标准函数打开的文件流默认都会以二进制模式运行,不会自动做\n到\r\n的转换,完全匹配GCC下的输出行为,不需要修改任何业务代码。
方案2:入口函数添加全局模式配置(仅修改1处代码)
如果不方便修改编译配置,可以在程序入口函数(main/WinMain)的最开头添加代码,全局修改标准输出、标准错误的模式:
#include <fcntl.h> #include <io.h> int main(int argc, char** argv) { // 新增以下两行即可,原有其他代码不需要变动 _setmode(_fileno(stdout), _O_BINARY); _setmode(_fileno(stderr), _O_BINARY); // 原有业务逻辑 // ... }
该方案仅修改入口代码,不需要改动任何核心业务逻辑,适配成本极低。
注意事项
- 若项目中存在依赖CRLF换行的第三方组件,修改后需做兼容性测试,大部分跨平台项目都可直接兼容纯LF换行
- 如果仅需要特定输出流使用LF换行,不需要全局修改,可以针对单个流单独调用
_setmode设置二进制模式即可
内容的提问来源于stack exchange,提问作者A.Sugiyama
相关产品推荐
相关产品推荐

