Backto C/C++ Index
库函数就是, 调用一时爽, debug 火葬场. 把踩过的各种坑列举如下.
库函数的版本不统一
因为年代久远, C++ 又要保证 对 C 的绝对兼容, 这个历史包袱就造成了某些常用函数有多个版本. 比如, 师爷就遇到过同样的程序在 PC 在跑的好好的, 移植到 Linux 结果就错了. debug 发现, 是 abs()
函数调用出了问题. PC 端调用的是定义在cmath
中 C++ 11 版本, 而 linux 调用的是 stdlib
中的C版本.
// C version
#include "stdlib.h"
int abs(int value) ; // only operates on int values
//C++ 11 version
#include <cmath>
T abs(T value);// works on int, float, double, etc
总结下来就是, 对常用的函数, 一定要精确定位, 尽量调用最新的C++版本. 不清楚的, 就去文档里查.
#include <cmath>
float pi=3.1415;
std::abs(pi);
库函数与宏定义混淆
比如在 windows.h
defines macros named min
and max
like so:
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))
这两个宏甚至会覆盖 std::min/std::max
,导致爆出 expected an identifier
这类的错误。解决方案是通过添加 #define NOMINMAX
把两个 macros 禁掉。因此,As a rule,每次调用 windows.h
必须添加 #define NOMINMAX
.
#include "windows.h"
#define NOMINMAX
平台私有库不能跨平台
比如,在 *nix 下经常会用到 #include <sys/time.h>
这个时间库(已被弃用obsolete)和里面的 gettimeofday
这个函数,在 Windows 下就没有这个函数,肿么破?自己写一份喽。然后跨平台的话,还要#ifdef ... #else...