当前位置: 首页 > news >正文

嵌入式C基础知识(23)

常用C/C++代码规范

头文件的保护

所有的头文件都应该使用#define来避免多次引用,符号格式为:<PROJECT>_<PATH>_<FILE>_H_

例如头文件:foo/src/bar/baz.h

#ifndef FOO_BAR_BAZ_H_

#define FOO_BAR_BAZ_H_

...#endif // FOO_BAR_BAZ_H_

头文件引用的顺序

例如在 google-awesome-project/src/foo/internal/http://fooserver.cc 中头文件的引用顺序为:

xxx.h

C 系统文件

C++ 系统文件

其他库的 .h 文件

本项目内 .h 文件

#include "foo/server/fooserver.h" // 源文件对应的头文件

#include "sys/types.h" // C/C++系统标准头文件,更准确地说:带有 .h扩展名的尖括号中的标头

#include "string" // C++ 标准库头文件(无文件扩展名),例如 <algorithm>, <cstddef>

#include "base/basictypes.h"

#include "third_party/absl/flags/flag.h" // 其他库的.h文件

#include "foo/server/bar.h" // 本项目中的其他.h 文件

关键字

关键字是C语言中具有特殊功能的保留标示符,按照功能可分为

1). 数据类型(常用char, short, int, long, unsigned, float, double)

2). 运算和表达式( =, +, -, *, while, do-while, if, goto, switch-case)

3). 数据存储(auto, static, extern,const, register,volatile,restricted),

4). 结构(struct, enum, union,typedef),

5). 位操作和逻辑运算(<<, >>, &, |, ~,^, &&),

6). 预处理(#define, #include, #error,#if...#elif...#else...#endif等),

7). 平台扩展关键字(__asm, __inline,__syscall)

这些关键字共同构成了嵌入式平台的C语法。

嵌入式的应用从逻辑上可以抽象为三个部分:

1). 数据的输入(如传感器,信号,接口输入),

2). 数据的处理(如协议的解码和封包,AD采样值的转换等)

3). 数据的输出(GUI的显示,输出的引脚状态,DA的输出控制电压,PWM波的占空比等),

对于数据的管理就贯穿着整个嵌入式应用的开发,它包含数据类型,存储空间管理,位和逻辑操作,以及数据结构,C语言从语法上支撑上述功能的实现,并提供相应的优化机制,以应对嵌入式下更受限的资源环境。

局部变量

将函数的变量放在尽可能窄的范围内,并在声明中初始化变量。

C++ 允许在函数中的任何位置声明变量。尽可能在本地范围内声明它们,并尽可能接近第一次使用。这使读者更容易找到声明并查看变量是什么类型以及它被初始化为什么。特别是,应该使用初始化而不是声明和赋值,例如:

int i;

i = f(); // Bad -- initialization separate from declaration.

int j = g(); // Good -- declaration has initialization.

std::vector<int> v;

v.push_back(1); // Prefer initializing using brace initialization.

v.push_back(2);

std::vector<int> v = {1, 2}; // Good -- v starts initialized.

注意:如果变量是一个对象,它的构造函数在每次进入作用域并被创建时都会被调用,而它的析构函数在每次超出作用域时都会被调用。

// 低效的实现:

for (int i = 0; i < 1000000; ++i) {

Foo f; // My ctor and dtor get called 1000000 times each.

f.DoSomething(i);

}

// 在循环外的循环中声明这样的变量可能更有效:

Foo f; // My ctor and dtor get called once each.

for (int i = 0; i < 1000000; ++i) {

f.DoSomething(i);

}

数据类型

C语言支持常用的字符型,整型,浮点型变量,有些编译器如keil还扩展支持bit(位)和sfr(寄存器)等数据类型来满足特殊的地址操作。C语言只规定了每种基本数据类型的最小取值范围,因此在不同芯片平台上相同类型可能占用不同长度的存储空间,这就需要在代码实现时考虑后续移植的兼容性,而C语言提供的typedef就是用于处理这种情况的关键字,在大部分支持跨平台的软件项目中被采用,典型的如下:

typedefunsignedcharuint8_t;typedefunsignedshortuint16_t;typedefunsignedintuint32_t;......typedefsignedintint32_t;

  既然不同平台的基本数据宽度不同,那么如何确定当前平台的基础数据类型如int的宽度,这就需要C语言提供的接口sizeof,实现如下。

printf("int size:%d, short size:%d, char size:%d\n",sizeof(int),sizeof(char),sizeof(short));

  这里还有重要的知识点,就是指针的宽度,如

char*p;printf("point p size:%d\n",sizeof(p));

  其实这就和芯片的可寻址宽度有关,如32位MCU的宽度就是4,64位MCU的宽度就是8,在有些时候这也是查看MCU位宽比较简单的方式。

http://www.lryc.cn/news/32667.html

相关文章:

  • 一文掌握组织项目等级划分维度,标准和实例
  • 【C++】list的使用和基本迭代器框架的实现 vs和g++下string结构的说明
  • 基于深度学习的轴承寿命预测实践,开发CNN、融合LSTM/GRU/ATTENTION
  • redis进阶:mysql,redis双写一致性,数据库更新后再删除缓存就够了吗?
  • RTOS中互斥量的原理以及应用
  • 数据分析:基于随机森林(RFC)对酒店预订分析预测
  • 【python】序列(列表、元组)、字典、集合的初步认识
  • 周赛335(模拟、质因子分解、分组背包)
  • 【极致简洁】Python tkinter 实现下载工具,你想要的一键获取
  • npm i 安装报错
  • 原腾讯QQ空间负责人,T13专家,黄希彤被爆近期被裁员,裁员原因令人唏嘘。。...
  • 【C++】BloomFilter——布隆过滤器
  • 【Spring】资源操作管理:Resource、ResourceLoader、ResourceLoaderAware;
  • 【System Verilog基础】automatic自动存储--用堆栈区存储局部变量
  • 看板组件:Bryntum Task Board JS 5.3.0 Crack
  • 45 个 Git 经典操作场景,专治不会合代码
  • MyBatis之动态SQL
  • SpringBoot(Tedu)—DAY01——环境搭建
  • 代理模式-大话设计模式
  • STM32定时器的编码器接口模式
  • Java方法的使用
  • Linux命令·nl
  • 排序模型:DIN、DINE、DSIN
  • 【C++】Clang-Format:代码自动格式化(看这一篇就够了)
  • Linux命令·more
  • 为什么 SaaS 公司依靠知识库来做对客户服务?
  • 后端必备之VUE基础【黑马程序员】
  • 现代HYUNDAI EDI需求分析
  • 数据库基本功之SQL的基本函数
  • 配置主机名与ip的映射关系