我们定义一个错误处理函数,这个错误处理函数可以让其他程序使用,如下:
```c
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#define BUF_SIZE 50
void err_exit(const char *format, ...)
{
char errorMsg[BUF_SIZE];
va_list argList;
va_start(argList, format);
vsprintf(errorMsg, format, argList); // 将可变参数以fotmat格式保存到errorMsg字符串
printf("Error:%s\n", errorMsg); // 将错误信息输出到标准输出
va_end(argList);
exit(0);
}
```
假设a.c和b.c两个程序都需要使用这个函数,最简单做法是每个程序复制一份函数的代码,但是有更多的程序需要用到这个函数时,应该考虑如何把函数抽出来公用,这样也方便维护代码;
首先将函数提取到一个单独文件error_functions.c
```c
void err_exit(const char *format, ...)
{
char errorMsg[BUF_SIZE];
va_list argList;
va_start(argList, format);
vsprintf(errorMsg, format, argList); // 将可变参数以fotmat格式保存到errorMsg字符串
printf("Error:%s\n", errorMsg); // 将错误信息输出到标准输出
va_end(argList);
exit(0);
}
```
再创建一个头文件error_functions.h,并声明函数
```c
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#define BUF_SIZE 50
void err_exit(const char *format, ...);
```
每个程序引入该头文件,以下为a.c文件
```c
#include "error_functions.h"
int main(int argc, char const *argv[])
{
err_exit("%s, msg:%s", "save failed", "param error");
return 0;
}
```
最后是编译,将a.c和error_functions.c编译并且链接到同一个文件
```c
gcc a.c error_functions.c -o a
```
当a.c调用err_exit函数时会自动链接到error_functions.c文件中的函数
- php
- 编译安装
- 基本概念
- 垃圾回收机制
- 生命周期
- zval底层实现
- c扩展开发
- gdb调试工具
- 自定义扩展简单demo
- 钩子函数
- 读取php.ini配置
- 数组
- 函数
- 类
- yaf扩展底层源码
- swoole扩展底层源码
- memoryGlobal内存池
- swoole协程使用记录
- 单点登录sso原理
- compser使用
- session实现机制
- c & linux
- gcc
- 指针
- 结构体,联合和位字段
- 宏定义井号说明
- printf家族函数和可变参数
- 共享函数
- 静态库和动态库
- makefile自动化构建
- 信号一
- 信号二
- inotify监控文件事件
- socket编程
- 简介
- UNIX DOMAIN
- Internet DOMAIN
- TCP/IP
- 文件IO多路复用
- 内存管理
- 进程组,会话和控制终端
- daemon守护进程
- 多进程
- 多线程
- 常用进制转换
- go
- 入门知识
- 字节和整数装换
- python
- redis
- 应用场景
- 消息队列
- 热点数据
- 扫码登录
- 订阅发布
- 次数限制
- 抢购超卖
- 持久化机制
- mysql
- 工作流程
- MyISAM和InnoDB区别
- 用户和权限管理
- 执行计划
- sql优化
- 事务和锁
- 慢查询日志
- case...when...then...end用法
- sql
- 参考
- linux
- 内核参数优化
- 防火墙设置
- docker
- docker入门知识
- 算法
- 多维数组合
- DFA算法
- 红包金额分配