C编程规范, 示例代码。

/***************************************************************
*Copyright (c) 2014,TianYuan
*All rights reserved.
*
*文件名称: standard.h
*文件标识: 编程规范示例代码
*
*当前版本:V1.0
*作者:wuyq
*完成日期:20140709
*
*修改记录1:   //修改历史记录,包括修改日期、版本号、修改人及修改内容等
*修改日期        版本号              修改人         修改内容
* --------------------------------------------------------------------------------------------------
* 20140709         V1.0                wuyq            创建
******************************************************************/

#ifndef _STANDARD_H__
#define _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;		/*传输通道0:网络 1:串口*/
    u8      u8Reserved[3];		/*对齐*/
}STRU_MSG_HEAD;

/* 时间信息*/
typedef struct {
    u16     u16Year;	/*年*/
    u16     u16Month;	/*月*/
    u8      u8Day;		/*日*/
    u8      u8Hour;		/*时*/
    u8      u8Minute;	/*分*/
    u8      u8Second;	/*秒*/
}STRU_TIME_INFO;

/* MCM->Main 查询系统信息*/
struct  stru_machine_info_req {
    STRU_MSG_HEAD   struMsgHeader;/*消息头*/
};

/* Main->MCM 反馈系统信息*/
struct stru_machine_info_rsp {
    STRU_MSG_HEAD   struMsgHeader;/*消息头*/
    f32             f32Temp;/*当前采样温度*/
    f32             f32Vol;/*当前采样电压*/
    f32             f32CpuFreq;/*Cpu频率*/
    u32             u32FreeMem;/*剩余内存*/
    u32             u32FreeDisk;/*剩余FLASH空间*/
};
/* Main向MCM返回软件升级结果 */
struct stru_software_update_rsp {
    STRU_MSG_HEAD   struMsgHeader;
    u8              b8Successful;/*是否升级成功*/
    u8              u8Reserved[3];/*字对齐,保留*/
};

//函数头部的可采用如下的样式
/**********************************************************************
 *功能描述:
 *输入参数:
 *输出参数:
 *返回值:
 *其它说明:
 *修改记录1:   //修改历史记录,包括修改日期、版本号、修改人及修改内容等
 *修改日期        版本号              修改人         修改内容
 * --------------------------------------------------------------------------------------------------
 * 20140709         V1.0                wuyq            创建
 ***********************************************************************/

#endif

/**********************************************************************
*Copyright (c) 2014,TianYuan
*All rights reserved.
*
* 文件名称: UnitTest.c
* 文件标识:无
* 内容摘要:协议及单元测试示例代码
* 其它说明:无
* 当前版本: V1.0
* 作    者: wuyq
* 完成日期: 20140709
*
*修改记录1:   //修改历史记录,包括修改日期、版本号、修改人及修改内容等
*修改日期        版本号              修改人         修改内容
* --------------------------------------------------------------------------------------------------
* 20140709         V1.0                wuyq            创建
**********************************************************************/
#include <stdio.h>
#include <string.h>

// 重定义数据类型
typedef unsigned char       UINT8;
typedef unsigned short int    UINT16;
typedef unsigned int        UINT32;
typedef signed   int        INT32;

// 消息头结构
typedef struct
{
    UINT16  iReserve1;
    UINT16  iReserve2;
    UINT16  iReserve3;
    UINT16  iReserve4;
}MsgHead_T;

// 消息结构体(包含消息头和消息体)
typedef struct
{
    MsgHead_T   MsgHead;                // 消息头
    UINT32      iOperType;      // 操作类型, 操作类型只能为1或2
    UINT8       szUserNumber[30];         // 用户号码
    UINT8       szOperTime[20];      // 操作时间, 格式为: yyyymmdd
    UINT32       iReserve1;                // 保留字段1
    UINT8        szReserve2[50];           // 保留字段2
}UserReqMsg_T;

// 函数声明
INT32 ProcUserReqMsg(UserReqMsg_T *ptUserReqMsg);
INT32 main();

/**********************************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返回值: 0-执行完毕
* 其它说明:无
* 修改日期        版本号              修改人         修改内容
* --------------------------------------------------------------------------------------------------
* 20140507         V1.0                zzx            创建
***********************************************************************/
INT32 main()
{
    UINT8  iRetVal          = 0;
    UINT32 iOperType        = 0;        // 操作类型
    UINT8  szUserNumber[30] = {0};      // 用户号码
    UINT8  szOperTime[10]  = {0};    // 操作时间, 格式为: yyyymmdd

    UserReqMsg_T tUserReqMsg = {0};     // 请求消息

    // 对消息头部进行赋值
    tUserReqMsg.MsgHead.iReserve1 = 1;
    tUserReqMsg.MsgHead.iReserve2 = 2;
    tUserReqMsg.MsgHead.iReserve3 = 3;
    tUserReqMsg.MsgHead.iReserve4 = 4;

    // 读入具体消息字段的值
    printf("操作类型: \n");
    scanf("%d", &iOperType);
    printf("用户号码: \n");
    scanf("%s", szUserNumber);
    printf("操作时间: \n");
    scanf("%s", szOperTime);

    // 对具体消息字段进行赋值(保留字段可不赋值)
    tUserReqMsg.iOperType = iOperType;
    strncpy(tUserReqMsg.szUserNumber, szUserNumber, strlen(szUserNumber));// 获取号码, 用strncpy代替strcpy
    strncpy(tUserReqMsg.szOperTime,   szOperTime,   strlen(szOperTime));     // 获取时间, 用strncpy代替strcpy

    // 对消息体的字段进行异常判断
    iRetVal = ProcUserReqMsg(&tUserReqMsg);  // 注意: 传递参数的时候要加上&
    if (iRetVal == 0)      // 函数执行正确
    {
        // 打印消息字段内容
        printf("The user request message is: iOperType=%d, szUserNumber=%s, szOperTime=%s.\n", tUserReqMsg.iOperType, tUserReqMsg.szUserNumber, tUserReqMsg.szOperTime);
        return 0;
    }
    else         // 打印异常消息
    {
        printf("Some content of the user request message is wrong, please check!\n");
        return -1;
    }
}

/**********************************************************************
* 功能描述:对消息体的字段进行异常判断
* 输入参数: ptUserReqMsg-用户请求消息
* 输出参数:无
* 返回值: 0-成功   其它-失败
* 其它说明:无
* 修改日期        版本号              修改人         修改内容
* --------------------------------------------------------------------------------------------------
* 20140507         V1.0                zzx            创建
***********************************************************************/
INT32 ProcUserReqMsg(UserReqMsg_T *ptUserReqMsg)
{
    INT32  iRetValue      = 0;

    // 对输入参数进行异常判断
    if (ptUserReqMsg == NULL)
    {
        printf("ProcUserReqMsg(...): input parameter(ptUserReqMsg) is NULL.\n");
        return -1;
    }

    // 对消息体字段进行异常判断
    if ((ptUserReqMsg->iOperType != 1) && (ptUserReqMsg->iOperType != 2))    // 操作类型只能为1或2, 其它为数据异常
    {
        printf("ProcUserReqMsg(...): the iOperType is wrong, iOperType=%d.\n", ptUserReqMsg->iOperType);
        return -2;
    }

    if (strlen(ptUserReqMsg->szUserNumber) != 8) // 用户号码异常, 长度8位才正确
    {
        printf("ProcUserReqMsg(...): the szUserNumber is wrong.\n");
        return -3;
    }

    if (strlen(ptUserReqMsg->szOperTime) != 8)  // 操作时间异常, 长度8位才正确
    {
        printf("ProcUserReqMsg(...): the szOperTime is wrong.\n");
        return -4;
    }

    return 0;
}

C编程规范, 示例代码。

时间: 2024-10-09 06:21:58

C编程规范, 示例代码。的相关文章

C语言编程规范--------10 代码编辑、编译、审查

(1)打开编译器的所有告警开关对程序进行编译. (2)在产品软件(项目组)中,要统一编译开关选项. (3)通过代码走读及审查方式对代码进行检查.代码走读主要是对程序的编程风格如注释.命名等以及编程时易出错的内容进行检查,可由开发人员自己或开发人员交叉的方式进行:代码审查主要是对程序实现的功能及程序的稳定性.安全性.可靠性等进行检查及评审,可通过自审.交叉审核或指定部门抽查等方式进行. (4)测试部测试产品之前,应对代码进行抽查及评审. (5)编写代码时要注意随时保存,并定期备份,防止由于断电.硬

Linux内核编程规范与代码风格

source: https://www.kernel.org/doc/html/latest/process/coding-style.html translated by trav, [email protected] 这是一篇阐述Linux内核编程代码风格的文档,译者以学习为目的进行翻译. 1 缩进 Tab的宽度是八个字符,因此缩进的宽度也是八个字符.有些异教徒想让缩进变成四个字符,甚至是两个字符的宽度,这些人和那些把 PI 定义为 3 的人是一个路子的. 注意:缩进的全部意义在于清晰地定义

C语言编程规范--------11 代码测试、维护

(1)单元测试要求至少达到语句覆盖. (2)单元测试开始要跟踪每一条语句,并观察数据流及变量的变化. (3)清理.整理或优化后的代码要经过审查及测试. (4)代码版本升级要经过严格测试. (5)使用工具软件对代码版本进行维护. (6)正式版本上软件的任何修改都应有详细的文档记录. (7)发现错误立即修改,并且要记录下来. (8)关键的代码在汇编级跟踪. (9)仔细设计并分析测试用例,使测试用例覆盖尽可能多的情况,以提高测试用例的效率. (10)尽可能模拟出程序的各种出错情况,对出错处理代码进行充

Python编程规范(PEP8)

Python编程规范(PEP8) 代码布局 缩进 对于每一次缩进使用4个空格.使用括号.中括号.大括号进行垂直对齐,或者缩进对齐. 制表符还是空格? 永远不要将制表符与空格混合使用.Python最常用的缩进方式是只是用空格. 当调用Python命令行的 -t 选项时,它会检测并警告代码非法混合使用制表符和空格.当使用 -tt 选项时,警告变成了错误. 最大行长度 限制所有行最长为79个字符. 使用反斜杠来分行是一个很好的选择. 我们应当选择在二元操作符之后进行分行,而不是之前. 空行 使用两行空

编程风格——整洁代码的4个提示

整洁代码的4个提示 虽然这样的文章非常的多,并且,就算是对于编程新手来说,也是非常的简单和显而见,但是,在我们进行Code Review过程中,我们还是能够看到那些非常混乱的代码,所以,有些时候,你会在想,是不是这样的规则太多了,导致我们的程序员记不住.虽然我们在以前的文章中一遍又一遍的说过(比如:<优质代码的十诫>),千言万语总结一下,无论你用什么样的语言,最最基本的编程原则就是下面这四条. 1 – 简短的方法 简单才会易读,简单才会容易,简单才能重用,简单才能保证质量.把一件事搞复杂,是一

C编程规范, 演示样例代码。

/*************************************************************** *Copyright (c) 2014,TianYuan *All rights reserved. * *文件名: standard.h *文件标识: 编程规范演示样例代码 * *当前版本号:V1.0 *作者:wuyq *完毕日期:20140709 * *改动记录1: //改动历史记录.包含改动日期.版本号号.改动人及改动内容等 *改动日期 版本号号 改动人 改动内

前端代码编码和设计规范系列——JavaScript编程规范

1文档信息 条目 内容 项目编号 通用 项目名称 通用 标题 JavaScript编程规范 类别 规范文档 当前 试用草稿 摘要 当前版本 V1.0 日期 2015/11/9 作者 徐维坚(xuweijian) 文档拥有者 内部公开 文件 前端规范系列-JavaScript篇.docx 2修改历史 编号 修订人 修订内容简述 修订 日期 修订前 版本号 修订后 版本号 V0001 徐维坚 编程规范文件编写,草稿试用版公布 2015/11/10 V1.0 规范前言 良好的编程规范对于软件的开发与维

《C#高级编程》委托、事件的示例代码

运行结果: Program.cs 1 using System; 2 3 namespace Wrox.ProCSharp.Delegates 4 { 5 class Program 6 { 7 static void Main() 8 { 9 var dealer = new CarDealer(); 10 11 var michael = new Consumer("Michael"); 12 dealer.NewCarInfo += michael.NewCarIsHere; 1

编译opengl编程指南第八版示例代码通过

最近在编译opengl编程指南第八版的示例代码,如下 1 #include <iostream> 2 #include "vgl.h" 3 #include "LoadShaders.h" 4 5 using namespace std; 6 7 8 enum VAO_IDs { Triangles, NumVAOs }; 9 enum Buffer_IDs { ArrayBuffer, NumBuffers }; 10 enum Attrib_IDs