解决跨平台C风格I/O问题
问题描述
这是最为人知的跨平台问题之一
平台
- 在
Windows
下,我们一般使用mingw-gcc
,一般使用MSVC风格的I/O - 在
Linux
下,我们使用原生的gcc
,一般使用GNU/ISO风格的I/O
表现
- 64位整数的I/O问题(
signed/unsigned long long
)Windows
下只能使用%I64d
,%I64u
Linux
下使用%lld
,%llu
- 扩展精度浮点数的I/O问题(
long double
)Windows
下无法输入/输出long double
类型,因为在MSVC中,long double==double
Linux
下使用%Lf
,%Lg
,%Le
等
解决方法
1. 使用C++流
最简单、安全的方法,使得I/O与平台无关
有的人提到流的效率问题,经测试,在gcc 4.8.4下,文件流并不比stdio慢
比赛中一般使用文件流而不是重定向stdin/stdout,将有更高的效率。
- 在
Windows
下,文件流效率是stdio的数倍- 在
Linux
下,文件流与stdio基本持平
2. 使用C99/C++11的<inttypes.h>
实现
提供预定义宏,我们常用的有
PRIxN
:printfPRId64
:输出long long
PRIu64
:输出unsigned long long
SCNxN
:scanfSCNd64
:输入long long
SCNu64
:输入unsigned long long
使用
1 |
|
不支持long double
3. 使用mingw
宏
在代码中加入#define __USE_MINGW_ANSI_STDIO 1
即可,mingw
将不使用MSVC而是按照标准C/C++处理I/O。
这是推荐的方法,而且在Linux
下也没有副作用。
4. 使用编译指令
加入-posix
指令即可,同样要求按照标准。