【C/C++】库函数使用中的坑

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...

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值