C/C++——嵌入式应用场景语法补充

导读:本篇文章讲解 C/C++——嵌入式应用场景语法补充,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

本文将就嵌入式应用场景下的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 变量的使用

  1. 全局变量的声明
    全局变量尽量只有添加的static才可以在头文件中定义,且该情况下只能在某一个C文件中有效;若要在多个C文件中有效,则需要添加extern关键词,详细参考如下链接:c语言中全局变量在多个文件中使用 – 与非网
  2. 指针的用法

    指针声明后必须实例化才能进行参数传递。

    具体使用参考链接:指针,C语言指针完全攻略

  3. 检查出错代码在哪个文件的哪一行

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 打印函数

4.2 常用头文件

  • sys/stat.h
  1. int stat(const char *restrict pathname,struct stat *restrict buf)
    返回一个结构,里面包括文件的全部属性,若成功返回0,若失败返回1;
  2. int fstat(int fields,struct stat *buf)
    由文件描述符取得文件状态,即用来将参数 field 所指向的文件状态复制到参数buf 所指向的结构体中(stat)。fstat()与stat()作用完全相同,不同之处在于传入的参数为已打开的文件描述符。
  • fcntl.h
  1. 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
  • 功能错误
  1. #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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!