C语言编程规范(个人整理)

  • 前言
  • 1、基本命名规则
  • 2、排版规则
  • 3、编程规则
  • 4、使用宏定义打印Debug信息

前言

  写这篇博客主要是希望自己能够按照这篇编程规范进行编程。

1、基本命名规则

规则:

  1. 文件名,函数,结构体,联合体,枚举 --> 大驼峰
  2. 变量,函数参数,宏参数,结构体字段,联合体成员 --> 小驼峰
  3. 宏,常量,枚举值,goto标签 --> 全大写,下划线分割
  4. 全局变量应增加 'g_'前缀,局部静态变量不加前缀
  5. 指针变量使用’p’前缀
  6. bool类型变量使用’b’前缀

建议:

  1. 作用域越大,命名应越精确,包括函数和变量
  2. 动作类函数,可以使用动宾结构,如:AddUser(),DeleteUser()
  3. 判断型函数,可以使用形容词或加is,如:DataReady(),IsWorking()
  4. 数据型函数,如:GetTotalCount()
  5. 局部变量命名应该简短,且能表达相关含义
  6. 通过 typedef 对结构体,联合体,枚举起别名时,尽量使用匿名类型,如:
typedef struct{char userName; int  userId;
}User;
  1. 需要指针自嵌套,可以增加’tag’前缀,如:
typedef struct tagTaskList{int userData;struct tagTaskList *pPrev;struct tagTaskList *pNext;
}TaskList;

2、排版规则

规则:

  1. 循环语句,条件语句必须要大括号,即便是空语句或只有一条语句
  2. 禁止 if / else / else if 写同一行
  3. if 左括号和 if 同一行,右括号和 else 以及 else 左括号一行,for 循环同理
  4. 多个变量定义和赋值语句不能写在同一行
  5. 代码缩进要求是4个空格
  6. 函数中的不同代码块之间要空一行,注释写在代码块前,如:
int GetTotalCount(int *arr, int len){int count = 0;//notes:for(int i = 0; i < len; i++){if(arr[i] > =5){count++;}}return count;
}

3、编程规则

规则:

  1. 每一个 .c 文件都需要对应 .h 文件,用于放置对外提供的函数声明、宏定义、类型定义等,不对外使用的函数可以用 static 限制
  2. 包含头文件时,应先包含稳定的头文件,顺序:标准C函数库,第三方库,自己写的头文件
#include <stdio.h>     //标准c库
#include <string.h>       //标准c库
#include <srt/srt.h>  //srt协议第三方库
#include "Test.h"     //自己写的
  1. 使用 #ifndef 防止头文件重复包含(或者#pragma once),如Test.h
#ifndef TEST_H_
#define TEST_H_
...
...
#endif /* TEST_H_ */
  1. 尽量不用 extern 调用外部变量和函数,应将这些变量和函数放在 .h 文件中,以供外部使用
  2. 调用函数要判断返回值,尤其这个返回值将被后续函数调用时,调用前要先检查返回值是否合理
  3. 如果不关心返回值,应将函数声明为void类型
  4. 函数指针的指针参数,应确定是否使用const修饰
  5. 多个 .c 文件要调用同一个内联函数,那么这个内联函数应该在 .h 中定义(否则无法内联,因为内联函数是在编译阶段展开的), 且内联函数不超过10行
  6. 宏函数并没有类型检查,可以考虑用内联函数代替
  7. 全局变量要少用,其它 .c 文件需要用到其他文件的全局变量时,尽量用函数接口提供全局变量
  8. #ifdef __cplusplus 可以用来避免C编译器编译 extern C 而出错
 #ifdef __cplusplusextern "C"{#endif......#ifdef __cplusplus}#endif

4、使用宏定义打印Debug信息

  1. 使用断言函数,函数原型 void assert( int expression ),实际上是一个宏定义函数。 如果表达式为真,继续执行;如果表达式为假,打印错误信息,调用 abort() 函数终止程序运行。此外,在 assert.h 头文件前使用#define NDEBUG 可以关闭断言函数。
#include <stdio.h>
//#define NDEBUG    //可以关闭assert断言函数
#include <assert.h>   //断言函数头文件
int main(){int ret = GetCount();assert(ret >= 0);  //用于判断函数返回值,ret < 0 程序终止return;
}
  1. 使用自定义的宏函数,如下:
#define PRINT_LOG    1
#define PRINT_ALOG  0#if    PRINT_LOG
#if PRINT_ALOG
#define ALOG(fmt, ...)          printf("%s:%s:%d "fmt, __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__);
#define LOG(fmt, ...)           ALOG(fmt, __VA_ARGS__)      //advance print 携带文件名、函数名、行号信息
#else
#define OLOG(fmt, ...)          printf(fmt, __VA_ARGS__)
#define LOG(fmt, ...)           OLOG(fmt, __VA_ARGS__)      //ordinary print
#endif#else
#define LOG(fmt, ...)
#endif//用于打印字符串 如:LOGSTR("Init successed\n");
#define LOG_STR             1
#if LOG_STR
#define LOGSTR(...)         printf(__VA_ARGS__)
#else
#define LOGSTR(...)
#endif/** 使用方式:* LOG用于打印带格式输出的字符串。* 在宏定义PRINT_ALOG为0时,打印ind和count信息;* 在宏定义PRINT_ALOG为1时,能够额外打印文件名、函数名、行号信息。* LOG("ind:%d\t count:%d\n", ind, count);* LOG_STR用于打印不带格式输出的字符串* LOG_STR("Init successed\n");*/

C语言编程规范(个人整理)相关推荐

  1. 华为c语言编程规范_C语言编程规范

    一.简介 代码编写规则应该在建立一个工程项目之前,应该贯穿整个项目的始终,以保证代码的一致性.采用标准的代码编写惯例,可以大大简化项目的维护负担.采用一种好的风格,以达到以下目的:可移植性.连贯.整洁 ...

  2. c语言编程题一空几分,C语言编程规范试题

    C语言编程规范试题 [说明]: 1.本试题中不考虑头文件引用问题(假定已经包含正确的头文件),C语言的标准函数都可用: 2.如果不特别说明,假定程序运行环境为:操作系统Windows 2000, VC ...

  3. 嵌入式软件工程师养成记-基本功能篇之c语言编程规范

    基本功能篇之c语言编程规范 为什么还在用c语言开发 首先将编程语言按照开发效率粗略的分为三个等级,低中高,对应的语言有汇编(低).c/c++(中).python(高).越低级的语言.开发效率越低.但是 ...

  4. 定义变量和常量的规范 c语言,C语言编程规范教材及练习(标识符命名与定义 变量 宏、常量 表的达式).pptx...

    C语言编程规范教材及练习(标识符命名与定义 变量 宏.常量 表的达式) C语言编程规范教材C语言编程规范工作组 201104目录标识符命名与定义 变量宏.常量表达式标识符的命名要清晰原则3.1 标识符 ...

  5. C/C++语言编程规范

    目录 前言 一.文件结构 1.1 版权和版本的声明 1.2 头文件的结构 1.3 头文件依赖 1.4 包含文件的次序 1.5 目录结构 二.程序的版式 2.1 空格还是制表位 2.2 空行 2.3 代 ...

  6. C语言编程规范 学习笔记

    C语言编程规范 一.代码总体原则 1.清晰 2.简洁 3.选择适合的风格,与代码原有风格保持一致 二.头文件 背景 术语定义 原则 2.1 头文件中适合放置接口的声明,不适合放置实现 原则 2.2 头 ...

  7. 嵌入式C语言编程规范

    前言 代码首先是给人看的,其次才是给机器执行的,因此一般情况下代码的可读性优先于性能,只有确定性能是瓶颈时,才需要主动优化. 可读性高的代码应当是易于理解并且易于实现的,代码越长越难看懂,可能出错的地 ...

  8. 黑马程序员:Java基础总结----Java语言编程规范

       黑马程序员:Java基础总结        Java语言编程规范:参考自SUN公司文档  ASP.Net+Android+IO开发..Net培训.期待与您交流!  I.   排版规范 A.  规 ...

  9. c语言分支编程改错题,二级C语言改错 二级C语言编程题 汇总整理篇.doc

    二级C语言改错 二级C语言编程题 汇总整理篇 360教育在线 宇创IT培训07年9月内部资料 内部资料,请勿公开传播 二.改错题 考试做题要求: 1.在/**********found******** ...

  10. c二级语言程序编程题,二级C语言编程题 汇总整理篇.doc

    二级C语言编程题 汇总整理篇 360教育在线 宇创IT培训07年9月内部资料 内部资料,请勿公开传播 三.编程题 考试做题要求: 1.按题目要求编写部分代码,不要改动已经有的代码. 2.在运行时如果遇 ...

最新文章

  1. NSInvocation
  2. java c3p0 连接 mysql_Java使用C3P0数据源链接数据库
  3. poj1743(后缀数组+二分--不可重叠最长重复子串)
  4. Vue项目 开启gzip
  5. LeetCode 105. 已知前序中序 求二叉树
  6. 发现还是 True Image Server v8.1.941 比较好用
  7. 沙漠种水稻,88岁的袁隆平又创造奇迹!他参与的“袁米”还有个大计划
  8. python和vba哪个难_VBA和Python到底哪个比较难学?
  9. 精益软件开发(Lean Software Development)
  10. NanoPi M1 Plus:Allwinner H3 搭建编译环境、编译主线Uboot、编译主线Linux Kernel 4.14、加Matrix2‘8屏、加Qt
  11. 【1】嵌入式TCP/IP协议——————Art-Net调试工具 DMX-Workshop
  12. ztree刷新后记住上次展开收起的菜单
  13. 89c51 单片机 c语言 编写sszymmh 歌曲 文档,Proteus仿真51单片机生日快乐音乐播放器...
  14. Paper reading:Authenticating Top-k Queries in Location-based Services with Confidentiality
  15. 嵌入式培训课程哪里好?嵌入式开发学习路线
  16. 计算机技术专硕学哪些课程,计算机专业考研需要考哪些科目
  17. Ubuntu 8.04中文智能拼音输入法
  18. 计算机操作系统 第三章:处理机调度与死锁(2)
  19. laravel短信验证接口思路
  20. 【仿真建模】第三课:AnyLogic入门基础课程 - 多层建筑行人疏散仿真讲解

热门文章

  1. JAVA游戏土行孙_《封神榜》土行孙,被誉为国内最知名矮星,现惨淡靠低保度日...
  2. 点成分享 | 麦氏比浊仪在药敏试验中的应用
  3. 解决spacedesk卸载/重装软件时显示 指定的账户已存在
  4. Python求向量的余弦值
  5. 推荐几个我收藏且星标的嵌入式技术公众号
  6. Windows及应用学习笔记
  7. CF687 D2 C. Bouncing Ball(DP)
  8. luogu P1357 花园
  9. Kvsc autorun.inf病毒
  10. 不需要抓包分析、简单粗暴的模拟校园网登录方法——基于python playwright