我們定義一個錯誤處理函數,這個錯誤處理函數可以讓其他程序使用,如下:
```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算法
- 紅包金額分配