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

前言

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

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 __cplusplus
 extern "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");
 */

  • 13
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
华为C语言编程规范是华为公司制定的用于规范C语言程序编写的一套准则。该编程规范主要是为了提高代码的可读性、可维护性和可重用性,减少潜在的错误和bug,并确保编写出高质量的软件。 华为C语言编程规范强调以下几个方面: 1. 命名规则:变量、函数及其他标识符采用有意义的、清晰的命名,避免使用过于简单的单个字母或缩写。 2. 缩进与排版:使用适当的缩进与排版格式,使代码结构清晰,易于阅读。统一使用空格或者Tab键进行缩进,保持一致性。 3. 注释规范:对代码进行适当的注释,解释代码的功能、实现思路、特殊情况等,方便他人理解和维护代码。 4. 函数规范:函数应该尽量短小、功能单一,避免出现过长的函数和过多的嵌套。函数的参数应该清晰明确,避免过多的全局变量的使用。 5. 错误处理:对于可能出现错误的情况,要进行适当的错误处理,包括返回错误码或者抛出异常,确保程序的健壮性和可靠性。 6. 内存管理:合理使用内存,避免内存泄漏和内存溢出,尽量使用动态内存分配和释放函数,如malloc和free。 7. 其他规范:遵守C语言标准,并避免使用C语言的一些不规范的用法和语法。 遵循华为C语言编程规范可以提高代码的可读性和可维护性,降低软件开发过程中出现错误的几率,提高开发效率。同时,也方便其他开发人员理解和修改代码,并且保证代码的质量和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值