本文将就嵌入式应用场景下的C语言的常用表述进行解释。
1. 常用关键词
- extern “C”
实现C++调用C语言的代码,即在该C++文件中用编译C语言的方式编译该部分代码
- 静态变量static
若需要一个同一的变量全局使用,可将该变量定义成static
全局变量加不加static是有区别的,详细参考:全局变量加static和不加的区别(转载)_Joanne0106的博客-CSDN博客
2. 变量的定义和生命
2.1 变量类型
- char字符型,short,int,long,long long整型
在8/32位机中:
sizeof unsigned char == 1
sizeof unsigned short == 2
sizeof unsigned int == 4
sizeof unsigned long == 4
sizeof unsigned long long == 8
在64位机中:char,shot,int,long long与8/32位机一样,只有unsigned long在32、64位机上结果不同,为8位。
- 枚举类型
把可能的值全都列举出来,变量的值只限于列举出来的值的范围,所有值唯一。例如:
enum data{A=1, B, C=4, D}; //数值依次为 {1,2,4,5}
2.2 变量的使用
- 全局变量的声明
全局变量尽量只有添加的static才可以在头文件中定义,且该情况下只能在某一个C文件中有效;若要在多个C文件中有效,则需要添加extern关键词,详细参考如下链接:c语言中全局变量在多个文件中使用 – 与非网 - 指针的用法
指针声明后必须实例化才能进行参数传递。
具体使用参考链接:指针,C语言指针完全攻略
- 检查出错代码在哪个文件的哪一行
3. 函数的声明和定义
4. 标准库文件中的常用元件
4.1 某些函数的用法
4.1.1 字符串相关函数
- sizeof()和strlen()的区别
strlen指字符的长度 sizeof指文件或者数据占的内存(字节)
例: char str[20]=”0123456789″;
int a=strlen(str); //a=10 int b=sizeof(str); //b=20
可使用#和##来处理字符串,详情见:干货!C语言中”#”和”##”的用法
- snprintf函数用法
int snprintf(char *buff, size_t n, const char * format, …);
函数说明:将可变个参数(…)按照format格式化成字符串,然后将其复制到buff中,最多从(…)中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n 的话,将不会溢出。
函数返回值:若成功则返回欲写入的字符串长度,若出错则返回负值,例:
snprintf(s,100,"%.*S",3,"abcd");
s的值为abc, %.*s 表示有两项, 第一项指定了长度,第二项则是%s的内容,所以取前三位
4.1.2 内存相关函数
- memset
void *memset(void* dest, int byte, size_t len)
将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。
- memcpy函数用法
void *memcpy(void *dest, const void *src, size_t n);
函数说明:从源 src 所指的内存地址的起始位置开始拷贝n个字节到目标 dest 所指的内存地址的起始位置中
- memcmp函数用法
int memcmp(const void *buf1, const void *buf2, unsigned int count);
函数说明:比较内存区域buf1和buf2的前count个字节。
函数返回值:当buf1<buf2时,返回值小于0
当buf1==buf2时,返回值=0
当buf1>buf2时,返回值大于0
注意:C语言是区分大小写的
4.1.3 std相关函数
- std::pair(value1 , value2 )
将两个数据组合成一个合体的数据,也就是一个结构体,例如std::pair(int, float)
pair实际上是一个结构体,其成员变量是first和second。 - std::make_pair
初始化一个pair使用的构造函数,也可以使用std::make_pair函数,其函数原型是:
template pair make_pair(T1 a, T2 b) {
return pair(a, b);
}
4.1.4 打印函数
- printf
参考链接:printf如何输出64位整数_JoeBlackZQQ的专栏-CSDN博客_输出64位
4.2 常用头文件
- sys/stat.h
- int stat(const char *restrict pathname,struct stat *restrict buf)
返回一个结构,里面包括文件的全部属性,若成功返回0,若失败返回1; - int fstat(int fields,struct stat *buf)
由文件描述符取得文件状态,即用来将参数 field 所指向的文件状态复制到参数buf 所指向的结构体中(stat)。fstat()与stat()作用完全相同,不同之处在于传入的参数为已打开的文件描述符。
- fcntl.h
- int open(<filename> ,<flag>)
flag的值:O_RDONLY 以只读方式打开文件;O_WRONLY 以只写方式打开文件;O_RDWR 以可读写方式打开文件。上述三种旗标是互斥的,也就是不可同时使用
- Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库
5. 高级语言中向量和标量的运算
C语言-向量基本概念:C语言-向量基本概念_xiaoshe的专栏-CSDN博客_c语言向量
C++ -> 向量(vector):学习C++ -> 向量( vector ) – wid – 博客园
python中用numpy进行向量和标量的计算:
Numpy中向量与标量计算_南风有翼的博客-CSDN博客
NumPy基础:数组和矢量计算_nudt_oys的博客-CSDN博客
向量和标量是不可以相加的,在C语言中可以用数组来指代向量吗?
答:在数学里,向量和标量是不可以计算的,但是在代码运行时,标量和向量是可以运算的。例如向量和标量的加法,可以将标量广播给向量中的每个元素相加,即每个向量元素都加上这个标量。
6. 常见错误
6.1 error
- 报错error
- 功能错误
- #define定义常量时注意给常量值加括号,否则使用类似强制转换命令的时候会只强制转换前面的值,导致最终的值计算错误
如:#define PARAM_VAL (DDR_BASE_ADDR+ 0xC000)
6.2 warning
6.3 printf的移植
(1)在单片机应用中,使用printf语句通过串口输出
使用之前必须包含相应的头文件:#include < stdio.h >
int fputc(int ch, FILE *f)//重定向,让printf输出到串口
{
USART_SendData(USART1, (uint8_t) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
return ch;
}
(1)、打印字符串:printf(“hello world!\n”);
(2)、打印数字或变量:printf(“a = %d\n”, a);
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/82520.html