C语言编程规范(个人整理)
C语言编程规范(个人整理)
- 前言
- 1、基本命名规则
- 2、排版规则
- 3、编程规则
- 4、使用宏定义打印Debug信息
前言
写这篇博客主要是希望自己能够按照这篇编程规范进行编程。
1、基本命名规则
规则:
- 文件名,函数,结构体,联合体,枚举 --> 大驼峰
- 变量,函数参数,宏参数,结构体字段,联合体成员 --> 小驼峰
- 宏,常量,枚举值,goto标签 --> 全大写,下划线分割
- 全局变量应增加 'g_'前缀,局部静态变量不加前缀
- 指针变量使用’p’前缀
- bool类型变量使用’b’前缀
建议:
- 作用域越大,命名应越精确,包括函数和变量
- 动作类函数,可以使用动宾结构,如:AddUser(),DeleteUser()
- 判断型函数,可以使用形容词或加is,如:DataReady(),IsWorking()
- 数据型函数,如:GetTotalCount()
- 局部变量命名应该简短,且能表达相关含义
- 通过 typedef 对结构体,联合体,枚举起别名时,尽量使用匿名类型,如:
typedef struct{char userName; int userId;
}User;
- 需要指针自嵌套,可以增加’tag’前缀,如:
typedef struct tagTaskList{int userData;struct tagTaskList *pPrev;struct tagTaskList *pNext;
}TaskList;
2、排版规则
规则:
- 循环语句,条件语句必须要大括号,即便是空语句或只有一条语句
- 禁止 if / else / else if 写同一行
- if 左括号和 if 同一行,右括号和 else 以及 else 左括号一行,for 循环同理
- 多个变量定义和赋值语句不能写在同一行
- 代码缩进要求是4个空格
- 函数中的不同代码块之间要空一行,注释写在代码块前,如:
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、编程规则
规则:
- 每一个 .c 文件都需要对应 .h 文件,用于放置对外提供的函数声明、宏定义、类型定义等,不对外使用的函数可以用 static 限制
- 包含头文件时,应先包含稳定的头文件,顺序:标准C函数库,第三方库,自己写的头文件
#include <stdio.h> //标准c库
#include <string.h> //标准c库
#include <srt/srt.h> //srt协议第三方库
#include "Test.h" //自己写的
- 使用 #ifndef 防止头文件重复包含(或者#pragma once),如Test.h
#ifndef TEST_H_
#define TEST_H_
...
...
#endif /* TEST_H_ */
- 尽量不用 extern 调用外部变量和函数,应将这些变量和函数放在 .h 文件中,以供外部使用
- 调用函数要判断返回值,尤其这个返回值将被后续函数调用时,调用前要先检查返回值是否合理
- 如果不关心返回值,应将函数声明为void类型
- 函数指针的指针参数,应确定是否使用const修饰
- 多个 .c 文件要调用同一个内联函数,那么这个内联函数应该在 .h 中定义(否则无法内联,因为内联函数是在编译阶段展开的), 且内联函数不超过10行
- 宏函数并没有类型检查,可以考虑用内联函数代替
- 全局变量要少用,其它 .c 文件需要用到其他文件的全局变量时,尽量用函数接口提供全局变量
- #ifdef __cplusplus 可以用来避免C编译器编译 extern C 而出错
#ifdef __cplusplusextern "C"{#endif......#ifdef __cplusplus}#endif
4、使用宏定义打印Debug信息
- 使用断言函数,函数原型 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;
}
- 使用自定义的宏函数,如下:
#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语言编程规范(个人整理)相关推荐
- 华为c语言编程规范_C语言编程规范
一.简介 代码编写规则应该在建立一个工程项目之前,应该贯穿整个项目的始终,以保证代码的一致性.采用标准的代码编写惯例,可以大大简化项目的维护负担.采用一种好的风格,以达到以下目的:可移植性.连贯.整洁 ...
- c语言编程题一空几分,C语言编程规范试题
C语言编程规范试题 [说明]: 1.本试题中不考虑头文件引用问题(假定已经包含正确的头文件),C语言的标准函数都可用: 2.如果不特别说明,假定程序运行环境为:操作系统Windows 2000, VC ...
- 嵌入式软件工程师养成记-基本功能篇之c语言编程规范
基本功能篇之c语言编程规范 为什么还在用c语言开发 首先将编程语言按照开发效率粗略的分为三个等级,低中高,对应的语言有汇编(低).c/c++(中).python(高).越低级的语言.开发效率越低.但是 ...
- 定义变量和常量的规范 c语言,C语言编程规范教材及练习(标识符命名与定义 变量 宏、常量 表的达式).pptx...
C语言编程规范教材及练习(标识符命名与定义 变量 宏.常量 表的达式) C语言编程规范教材C语言编程规范工作组 201104目录标识符命名与定义 变量宏.常量表达式标识符的命名要清晰原则3.1 标识符 ...
- C/C++语言编程规范
目录 前言 一.文件结构 1.1 版权和版本的声明 1.2 头文件的结构 1.3 头文件依赖 1.4 包含文件的次序 1.5 目录结构 二.程序的版式 2.1 空格还是制表位 2.2 空行 2.3 代 ...
- C语言编程规范 学习笔记
C语言编程规范 一.代码总体原则 1.清晰 2.简洁 3.选择适合的风格,与代码原有风格保持一致 二.头文件 背景 术语定义 原则 2.1 头文件中适合放置接口的声明,不适合放置实现 原则 2.2 头 ...
- 嵌入式C语言编程规范
前言 代码首先是给人看的,其次才是给机器执行的,因此一般情况下代码的可读性优先于性能,只有确定性能是瓶颈时,才需要主动优化. 可读性高的代码应当是易于理解并且易于实现的,代码越长越难看懂,可能出错的地 ...
- 黑马程序员:Java基础总结----Java语言编程规范
黑马程序员:Java基础总结 Java语言编程规范:参考自SUN公司文档 ASP.Net+Android+IO开发..Net培训.期待与您交流! I. 排版规范 A. 规 ...
- c语言分支编程改错题,二级C语言改错 二级C语言编程题 汇总整理篇.doc
二级C语言改错 二级C语言编程题 汇总整理篇 360教育在线 宇创IT培训07年9月内部资料 内部资料,请勿公开传播 二.改错题 考试做题要求: 1.在/**********found******** ...
- c二级语言程序编程题,二级C语言编程题 汇总整理篇.doc
二级C语言编程题 汇总整理篇 360教育在线 宇创IT培训07年9月内部资料 内部资料,请勿公开传播 三.编程题 考试做题要求: 1.按题目要求编写部分代码,不要改动已经有的代码. 2.在运行时如果遇 ...
最新文章
- NSInvocation
- java c3p0 连接 mysql_Java使用C3P0数据源链接数据库
- poj1743(后缀数组+二分--不可重叠最长重复子串)
- Vue项目 开启gzip
- LeetCode 105. 已知前序中序 求二叉树
- 发现还是 True Image Server v8.1.941 比较好用
- 沙漠种水稻,88岁的袁隆平又创造奇迹!他参与的“袁米”还有个大计划
- python和vba哪个难_VBA和Python到底哪个比较难学?
- 精益软件开发(Lean Software Development)
- NanoPi M1 Plus:Allwinner H3 搭建编译环境、编译主线Uboot、编译主线Linux Kernel 4.14、加Matrix2‘8屏、加Qt
- 【1】嵌入式TCP/IP协议——————Art-Net调试工具 DMX-Workshop
- ztree刷新后记住上次展开收起的菜单
- 89c51 单片机 c语言 编写sszymmh 歌曲 文档,Proteus仿真51单片机生日快乐音乐播放器...
- Paper reading:Authenticating Top-k Queries in Location-based Services with Confidentiality
- 嵌入式培训课程哪里好?嵌入式开发学习路线
- 计算机技术专硕学哪些课程,计算机专业考研需要考哪些科目
- Ubuntu 8.04中文智能拼音输入法
- 计算机操作系统 第三章:处理机调度与死锁(2)
- laravel短信验证接口思路
- 【仿真建模】第三课:AnyLogic入门基础课程 - 多层建筑行人疏散仿真讲解
热门文章
- JAVA游戏土行孙_《封神榜》土行孙,被誉为国内最知名矮星,现惨淡靠低保度日...
- 点成分享 | 麦氏比浊仪在药敏试验中的应用
- 解决spacedesk卸载/重装软件时显示 指定的账户已存在
- Python求向量的余弦值
- 推荐几个我收藏且星标的嵌入式技术公众号
- Windows及应用学习笔记
- CF687 D2 C. Bouncing Ball(DP)
- luogu P1357 花园
- Kvsc autorun.inf病毒
- 不需要抓包分析、简单粗暴的模拟校园网登录方法——基于python playwright