standard.h統一資料型別定義、訊息結構、函式文檔格式,確保跨模組協作一致性。
typedef char s8;
typedef unsigned char u8;
typedef signed short s16;
typedef unsigned short u16;
typedef int s32;
typedef unsigned int u32;
typedef float f32;
typedef signed long long s64;
typedef unsigned long long u64;
typedef enum { FALSE = 0, TRUE = !FALSE } bool;
typedef bool BOOL;
typedef struct {
u16 u16MsgType;
u16 u16MsgLength;
u8 u8TransType;
u8 u8Reserved[3];
} STRU_MSG_HEAD;
typedef struct {
u16 u16Year, u16Month;
u8 u8Day, u8Hour, u8Minute, u8Second;
} STRU_TIME_INFO;
/**********************************************************************
* 功能描述:
* 輸入參數:
* 輸出參數:
* 返回值:
* 其它說明:
* 修改記錄:
**********************************************************************/
UnitTest.c展示訊息封裝、參數驗證、錯誤碼回傳、安全字串複製(strncpy)等工程實務。
typedef struct {
UINT16 iReserve1, iReserve2, iReserve3, iReserve4;
} MsgHead_T;
typedef struct {
MsgHead_T MsgHead;
UINT32 iOperType; // 1 或 2
UINT8 szUserNumber[30]; // 8 位數
UINT8 szOperTime[20]; // yyyymmdd
UINT32 iReserve1;
UINT8 szReserve2[50];
} UserReqMsg_T;
INT32 main() {
UserReqMsg_T tUserReqMsg = {0};
// 填寫訊息頭
tUserReqMsg.MsgHead.iReserve1 = 1; // ...
// 讀取使用者輸入
scanf("%d", &iOperType);
scanf("%s", szUserNumber);
scanf("%s", szOperTime);
// 安全複製,防止緩衝區溢位
strncpy(tUserReqMsg.szUserNumber, szUserNumber, strlen(szUserNumber));
strncpy(tUserReqMsg.szOperTime, szOperTime, strlen(szOperTime));
// 驗證業務邏輯
INT32 iRetVal = ProcUserReqMsg(&tUserReqMsg);
if (iRetVal == 0) {
printf("iOperType=%d, szUserNumber=%s, szOperTime=%s\n", ...);
return 0;
} else {
printf("Message content error!\n");
return -1;
}
}
INT32 ProcUserReqMsg(UserReqMsg_T* ptUserReqMsg) {
if (!ptUserReqMsg) return -1; // 空指標
if (ptUserReqMsg->iOperType != 1 && ptUserReqMsg->iOperType != 2) return -2;
if (strlen(ptUserReqMsg->szUserNumber) != 8) return -3;
if (strlen(ptUserReqMsg->szOperTime) != 8) return -4;
return 0;
}
| 項目 | 規範要求 |
|---|---|
| 型別定義 | 統一使用 u8/u16/u32/s8/s16/s32,禁用原生型別跨模組傳遞 |
| 結構體對齊 | 保留欄位 u8Reserved[3] 確保 4-byte 對齊 |
| 字串操作 | 嚴禁 strcpy/sprintf,改用 strncpy/snprintf |
| 指標傳遞 | 函式參數用指標,呼叫端必須傳 &struct |
| 錯誤處理 | 分級錯誤碼(-1~-4),主程式依碼處理 |
| 記憶體管理 | 動態分配必檢查 NULL,用完即 free |
| 文檔註解 | 每個函式必備標準文檔區塊,修改歷史可追溯 |
遵循此規範可大幅降低嵌入式專案的整合風險,提升代碼可讀性與可維護性。