一、 总览
1.1库函数
函数名 | 头文件 | 功能 | 原型 | 说明 |
syslog | syslog.h | 记录至系统记录(日志) | void syslog(int, const char *, ...) __printflike(2, 3) | 参数1:优先级,参数2:要输出到系统日志的 参数3:(格式化)字符串 |
perror | stdio.h | 将上个函数错误原因输出至stderr | void perror(const char *) | 参数:要优先打印到stderr的字符串 |
memset |
string.h /memory.h |
将指定内存区域全部设置为默认ASCII码值 | void *memset(void *, int, size_t) |
参数1:指定内存块指针 参数2:字符ASCII码 参数3:要初始化的内存前n个字节数 |
bzero | strings.h |
置字符串前n个字节=0,且包括' ' , 已被舍弃,由memset取代; 类似的有bcopy,bcmp等 |
void bzero(void *, size_t) |
参数1: 指定内存块指针 参数2: 要初始化为0的内存前n个字节 |
abort | stdlib.h | 引发程序不正常终止 |
void abort(void) __dead2 #define __dead2 __attribute__((noreturn)) |
无参数 __attribute__((noreturn)) 表示希望自定义有返回值函数不想返回值 |
宏定义 | 头文件 | 功能 | 原型 | 说明 |
assert | assert.h |
断言,用于调试时判断表达式是否通过验证 (真:通过;假:未通过) |
#define assert(e) ((void) ((e) ? ((void)0) : __assert (#e, __FILE__, __LINE__))) #define __assert(e, file, line) ((void)printf ("%s:%u: failed assertion `%s' ", file, line, e), abort()) |
e:表达式的值 __FILE__:文件名 __LINE__:当前代码行号 |
1.2宏定义
1)几个ANSI C标准定义的编译器内置宏
__LINE__:在源代码中插入当前源代码行号;
__FILE__:在源文件中插入当前源文件名;
__DATE__:在源文件中插入当前的编译日期
__TIME__:在源文件中插入当前编译时间;
__STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;
__cplusplus:当编写C++程序时该标识符被定义。
2.函数实现源码
2.1 memset 常用于内存空间初始化
1 /** 2 * 3 * 原型:void *memset(void *buffer, int c, int count); 4 * 头文件:string.h 或memory.h 5 * 功能:把buffer所指内存区域的前count个字节设置成字符c 6 * 参数: buffer 要设置值的内存区域首地址指针 7 * c 字符ASCII码 8 * count 内存区域字节数 9 * 返回值: 置成字符c后的内存区域首地址指针 10 * 说明:返回指向buffer的指针。 11 */ 12 void *memset(void *src, int c, size_t count) 13 { 14 assert(src != NULL); 15 char *tmpSrc = (char *)src; 16 while (count --) { 17 *tmpSrc =(char)c; 18 tmpSrc ++; 19 } 20 return src; 21 }
e.g 使用,如初始化一个结构体
struct Grade { char name[30]; int score; }; struct Student { uint16_t id; char name[20]; char sex; struct Grade grade; }; //初始化 void init(){ struct Student student;//开辟内存空间 memset((void*)&student, 0, sizeof(struct Student));//结构体student所指向内存空间全部=(char)0//开辟内存空间 }