标准库的实现版本
C语言标准库也只是一群大佬定义的一种标准,并没有要求谁或者限制谁来实现,自然和编译器一样,也会有许多的版本。
让我们来看看标准库有哪一些版本。
- glibc:GNU提供的C标准库
- BSD libc:BSD提供的C标准库
- Microsoft C run-time library:微软提供的标准库属于Visual C++的一部分。
- Bionic:谷歌为Android操作系统开发的标准库。
stdio.h
中的uint64整数
使用printf过程中,一定要写对字符串,之前遇到过一个问题,使用d来打印一个int64的数是错误的,例如下列代码
uint64_t a = 1000;
printf("%d\n",a);
实际上,u,ld,lu都不对,在曾经一个ARM平台编译器上,正确的结果是llu,因为在该平台上,sizeof(long)=sizeof(int)=4,而uint64_t真正的类型是long long,在不同平台时,要注意类型字节数可能不一样。
size_t类型才不会报warning
size_t foo;
...
printf("foo = %lu\n", (unsigned long) foo);
size_t foo;
...
printf("foo = %zu\n", foo);
彩色规范打印
#indef PRINT_ERROR
#define PRINT_ERROR(...) \
do{ \
printf("\x1B[41;37m"); \
printf("[ERROR]"); \
printf("\x1B[0m"); \
printf(__VA_ARGS__); \
} \
while(0)
#endif
#ifndef PRINT_INFO
#define PRINT_INFO(...) \
do{ \
printf("\1xB[42;37m"); \
printf("[INFO] "); \
printf(__VA_ARGS__); \
} \
while(0)
#endif
float.h
FLT_EPSILON宏和DBL_EPSILON
问题:做除法的时候,我们知道分母不能为0,那么如何检查呢? “if(a!=0.0f)”这种小学生的错误就不要犯了。
解决方法:一般来说我们需要拿到一个很小的数,如果分母的绝对值小于这个数,就认为分母为零。 最适合的方法是使用<float.h>提供的FLT_EPSILON和DBL_EPSILON。
#include <stdio.h>
#include <float.h>
int main(int argc, char* argv[]){
printf("FLT_EPSILON=%.20f\n", FLT_EPSILON);
printf("DBL_EPSILON=%.20f\n", DBL_EPSILON);
}
运行结果为:
FLT_EPSILON=0.00000011920928955078
DBL_EPSILON=0.00000000000000022204
判断数字是否是nan
isnan()函数。