嵌入式进阶必看!7个硬核的 C 语言要点
出处:厂商供稿 发布于:2022-01-18 17:27:12
1
void 与 void*
void表示的是无类型,不可以采用这个类型声明变量或常量,但是可以把指针定义为void类型,如void* ptr。
void指针可以指向任意类型的数据,可用任意数据类型的指针对void指针赋值,比如int *ptrInt;void *ptrVoid = ptrInt ;指针的赋值可以认为是地址的传递,而一般的32位系统指针都是占用4个字节,所以指针赋值仅仅只是这4个字节的赋值与类型没什么关系。
1void * memcpy( void *deST, const void *src, size_t len );
2void * memset( void * buffer, int c, size_t num);
2
volaTIle关键字
volatile修饰表示变量是易变的,编译器中的优化器在用到这个变量时必须每次都小心地从内存中重新读取这个变量的值,而不是使用保存在寄存器里的备份,有效的防止编译器自动优化,从而与软件设计相符合。
3
数据占用大小
数据占用大小是指不同的数据类型在平台中所占用的字节个数,不同的平台不同类型占用的字节个数稍有不同,不过在对应的平台进行开发过程中,必须要对每个数据类型的占用大小了如指掌,否则各种数据溢出,数据越界等等接踵而来。下面是简单罗列的一些数据占用情况:(在一般32位PC中)
char
8bit
short
16bit
int
32bit
long
32bit
float
32bit
double
64bit
4
const与指针
const是恒定不变的意思,与指针的结合主要的问题是其const在指针中的位置导致该变量属性不同。主要的识别办法是去掉数据类型,看const修饰的是哪部分。
const int *ptr --> const *ptr -->那么const修饰的就是*ptr,而*ptr表示的是指针所指向内容,所以其总体也叫"常量指针"表示值无法改变。
int *const ptr --> *const ptr -->那么const修饰的就是ptr,而ptr表示的是指针变量,指针变量的值就是地址,所以总体也叫"指针常量"表示地址无法改变。
5
结构体与共联体
对于结构体和共联体在嵌入式领域是使用得非常频繁的,一些可编程芯片提供的寄存器库都是采用结构体和共联体结合的方式来提供给软件人员进行开发,同时在平时的编码过程中这两个数据类型的灵活应用也能够实现代码更好的封装与简化。
如下面的简单示例,就可以非常灵活的访问Val中的bit位。
1typedef union
2{
3 BYTE Val;
4 struct __packed
5 {
6 BYTE b0:1;
7 BYTE b1:1;
8 BYTE b2:1;
9 BYTE b3:1;
10 BYTE b4:1;
11 BYTE b5:1;
12 BYTE b6:1;
13 BYTE b7:1;
14 } bits;
15}BYTE_VAL, BYTE_BITS;
6
预定义标识符
一般编译器都支持预定义标识符,这些标识符结合printf等打印信息帮助程序员调试程序是非常有用的,一般编译器会自动根据用户指定完成替换和处理。
如下是常用的标识:
__FILE__ :表示进行编译的源文件字符串;
__LINE__ :表示当前文件的行号;
__DATE__:表示文件日期;
__TIME__ :表示文件时间;
使用范例:
1printf("file:%s\n line:%d \n data:%s \n time: %s \n",__FILE__,__LINE__,__DATE__,__TIME__);
7
#与##
#:是一种运算符,用于带参宏的文本替换,将跟在后面的参数转成一个字符串常量。
##:是一种运算符,是将两个运算对象连接在一起,也只能出现在带参宏定义的文本替换中。
1#define STR(s) #s
2#define COMB(str1,str2) str1##str2
3int main()
4{
5 int UART1= 57600;
6 printf("%d\n", COMB(UART, 1));
7 printf("%s\n", STR(3.1415));
8 return 0;
9}
版权与免责声明
凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。
本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。
如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。
- 什么是嵌入式SoC2024/4/3 16:20:28
- EasyARM-i.MX283(7)A 默认供电方案2024/3/28 17:39:53
- EasyARM-i.MX283(7)A 的快速入门2024/3/27 17:29:30
- 非线性数字滤波器:用例和示例代码2024/3/14 16:34:20
- 嵌入式微控制器的自动代码生成2024/2/26 16:51:13