首页 > 编程语言 >阅读STM32-hal库代码得到的几点C代码编程规范

阅读STM32-hal库代码得到的几点C代码编程规范

时间:2023-12-22 11:49:30浏览次数:30  
标签:__ hal 函数 代码 规范 STM32 extern 头文件 定义

阅读STM32-hal库代码得到的几点C代码编程规范

规范一:
头文件使用

#ifndef _XXX_H
#define _XXX_H

#ifdef __cplusplus
extern "C" {
#endif


// 头文件内容


#ifdef __cplusplus
}
#endif
#endif

在C++编译环境中,会定义__cplusplus宏,如果在C++代码中需要使用C语言的函数和变量,就需要使用extern "C" {...}将C语言的代码放在花括号中,表示其中的代码需要按照C语言的规则进行编译。

如果在C语言环境中,没有__cplusplus宏,所以就不会使用extern "C" {...},所有代码都会按照C语言的规则进行编译。

在.h头文件中一般会有以下内容:

  1. 包含另外一些头文件
  2. 进行typedef结构体类型的定义
  3. 进行enum枚举体类型的定义
  4. 宏定义#define
  5. 函数声明(供其他.c文件调用)
  6. extern一些全局变量(供其他.c文件调用)

规范二:
在c文件中只放对应的h头文件,其他需要的头文件都包含在自己的头文件中。

规范三:
c文件中定义的全局变量如果需要让别的文件引用,就将该变量以extern的方式放在对应头文件中。别的文件如果需要使用这个全局变量,就包含该头文件即可。

规范四:
函数前面加上static,说明该函数只在该文件中使用,即为私有函数。在当前c文件的最前面声明该static函数即可。(供当前c文件调用)

规范五:
对于函数来说,默认为extern。加不加extern是等价的。除非使用static关键字,否则一般函数声明都默认为extern。

规范六:
使用#define的方式定义函数很常见。
对于宏定义,保险的做法是不仅应在参数两侧加括号,也应在整个字符串外加括号。

/**
  * @brief Clear ADC error code (set it to no error code "HAL_ADC_ERROR_NONE").
  * @param __HANDLE__ ADC handle
  * @retval None
  */
#define ADC_CLEAR_ERRORCODE(__HANDLE__) ((__HANDLE__)->ErrorCode = HAL_ADC_ERROR_NONE)

规范七:
使用枚举类型一般是定义一些状态值。作为函数的返回类型。

规范八:
如果函数需要传入结构体,则一般是传入结构体指针,这样传参更加快速。

规范九:
变量的命名:驼峰命名法

规范十:
弱函数定义

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);

  /* NOTE: This function should not be modified, when the callback is needed,
            the HAL_GPIO_EXTI_Callback could be implemented in the user file
   */ 
}

__WEAK也是一个宏,被定义成了如下:

#ifndef   __WEAK
  #define __WEAK                                 __attribute__((weak))
#endif

用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak声明的函数,并且编译器不会报错。所以我们可以在别的地方定义一个相同名字的函数,而不必也尽量不要修改之前的函数。

标签:__,hal,函数,代码,规范,STM32,extern,头文件,定义
From: https://www.cnblogs.com/haostudio/p/17921264.html

相关文章

  • el-select自定义指令用于触底加载分页请求options数据(附上完整代码和接口可直接用)
    问题描述某些情况下,下拉框需要做触底加载,发请求,获取option的数据为了方便复用,笔者封装了一个自定义指令另外也提供了一个简单的接口,用于演示我们先看看效果图效果图思路分析注意事项一el-select要不嵌入到body中为何,不嵌入到body标签中呢?答曰,更加方便自定义指令管理......
  • 明晚直播:两小时玩转代码审计
    本次的课程的内容为:1.代码审计快速入门秘籍2.深入探析SQL注入白盒审计3.全流程解跑开源组件漏洞4.业务逻辑漏洞审计及防范5.漏洞发现中敏感信息泄露的重要性 12月23日晚20:00,我们不见不散~  Ms08067安全实验室专注于网络安全知识的普及和培训,是专业的“图书出版+培训”......
  • word文档转html富文本,富文本编辑器 转成html5代码
    用我现在最常使用的php框架fastadmin举例子,当然thinkphp或者原生php也是同样的原理,大家理解思路就好了、 环境:fastadmin,summernote编辑器【summernote的居中功能在段落里,且不会吃掉section标签,加上导入word功能之后,简直完美~】 按照国际惯例先放效果图  github上的de......
  • 【低代码】低代码平台协同&敏捷场景下的并行开发解决方案探索
    低代码开发平台的出现,大大地提高的产品交付效率,但是在协同开发、敏捷迭代的场景下,也暴露出了一些问题。例如:多人同时对项目进行修改,相互影响甚至修改内容被互相覆盖;同一项目下多个需求同步开发,但需求上线日期不统一,无法拆分上线等等。本文将根据不同诉求,渐进式的讨论支......
  • MyBatis-Plus 可视化代码生成器
    MyBatis-Plus可视化代码生成器来啦,让你的开发效率大大提速!!来源:blog.csdn.net/yelangkingwuzuhu/article/details/128077533前言一、mybatis-plus-generator-ui是什么?二、mybatis-plus-generator-ui怎么用?1、mavenpom引入2、新建程序入口,以main函数的方式运行3、......
  • gnuradio笔记[1]-内嵌python代码块
    摘要在GNURadio中简单使用内嵌python代码块实现输出内容到文件.超链接解决无法编辑代码块内代码原理简介GNURadio简介[https://wiki.gnuradio.org/index.php?title=What_Is_GNU_Radio]GNURadioisafree&open-sourcesoftwaredevelopmenttoolkitthatprovidessig......
  • 机器学习-线性分类-支持向量机SVM-SMO算法代码实现-15
    1.alpha2的修剪ify1!=y2:α1-α2=k#不用算k的具体大小ifk>0:#上图的左下这条线α2的区间(0,c-k)k<0:#上图的左下这条线α2的区间(-k,C)所以:L=max(0,-k)#k>0还是<0都统一表达了H=min(c,c-k)else:y1=y2右边的图同理2.参......
  • 《代码大全》读后感三
    在《代码大全》这本书中,作者通过一个关于变量命名的例子向读者展示了好的命名习惯对于代码可读性的重要性。假设我们有一个简单的程序,用于计算圆的面积。下面是两个版本的代码,一个是使用模糊命名的变量,另一个是使用清晰命名的变量:模糊命名的变量版本:defarea(r):a=3.14*......
  • 《代码大全》读后感二
    在《代码大全》这本书中,作者SteveMcConnell通过丰富的例子向读者展示了许多编程技巧和最佳实践。以下是书中的一些例子及其说明:清晰的命名:作者通过比较清晰和模糊的变量命名,向读者展示了好的命名习惯对于代码可读性的重要性。他举了一个例子,对比了一个使用有意义命名的变量和......
  • 修改vm代码减少vm坑点
    /***[email protected]*安装:nodejs*然后:npminstallvm2npminstallcanvasnpminstalljsdom*提示:建议每一个编写完事的js建议用fd的js调试工具压缩一下,减少占用行数**使用vm2之前,先修改vm2本地文件**1、修改vm.js里的*//Create......