
C & C++
xuezhimeng2010
这个作者很懒,什么都没留下…
展开
-
关于宏和inline
宏是在代码处不加任何验证的简单替代,而内联函数是将代码直接插入调用出,而减少了普通函数调用时的资源消耗。宏不是函数,只是在编译前(编译预处理阶段)将程序中有关字符串替换成宏体;inline函数式函数,但在编译中不单独产生代码,而是将有关代码嵌入到调用处。inline函数例子:inline fact (float i) { return i * i };//没有写返回值的原创 2013-03-04 19:16:32 · 364 阅读 · 0 评论 -
strcat 小bug引起的大问题
在调试STM32时,单步打断点运行时,没有问题,但是全速运行时,偶尔会跳过错误,偶尔也会跳转hardfault;问题实在难找。。。最后定位在发送数据的缓存上, 发现发送缓存部分除了应该有的数据之外, 还有好多不 为0的值;也就是说,在栈上申请的内存,没有经过初始化,就使用strcat来追加字符串了;详细查了一下strcat的用法,发现strcat需要先找到dest的结尾,才能够继续原创 2014-12-25 17:56:29 · 2134 阅读 · 0 评论 -
状态机在嵌入式串口通信编程中的应用
状态机在嵌入式编程中绝对是个不可多得的好东西,用顺手了,程序可以简短不少,可以少用好多标志位,这是我目前了解到的。通信中的应用:串口通信在嵌入式开发中,绝对是必须的一个环节。大多数采用中断接收,主动发送的方式,进行通信。通信接收部分,可以直接简单的只是接收;当然也可以在接收过程中就进行判断,当接收到包头(帧头)时,才开始接收,否则放弃,等待包头部分。这个判断的过程中就用到了状态机。原创 2014-11-13 20:53:58 · 3678 阅读 · 0 评论 -
指针相关的自增
1、*p++ 或者 *(p++) 自增前表达式值是*p, 以后再自增p2、(*p)++ 自增前表达式值是*p,以后再自增*p3、*++p 或者 *(++p) 先自增p,自增后表达式的值是*p4、++*p 或者 ++(*p) 先自增*p,自增后表达式的值是*p原创 2013-12-03 12:34:07 · 668 阅读 · 0 评论 -
返回指针的函数
#includeint* max_num(int *a, int *b);int main(){ int *max; int a = 10; int b = 15; max = max_num(&a, &b); printf("MAX = %d\n", *max); return 0;}int *max_num(int *a, int *b){ if(*a > *b原创 2013-11-25 21:56:46 · 812 阅读 · 0 评论 -
指针的使用
定义一个int型数组,然后定义一个char型指针,指向int型数组首地址,char型指针加1,指针中的内容是一个char型数据,并且两个char的内容正好是int的内容,至于哪个在前面,哪个在后面,这跟数据存储的大小端就有关了。这样就可以实现将一个int或long等整型数据通过串口(发送unsiged char型数据)多次发送出去了。原创 2013-11-10 21:48:58 · 810 阅读 · 0 评论 -
数组的初始化
当定义数组时,必须要初始化!如果不初始化,默认的数据会出错,规范的编译器会报错,编译不通过。数组在部分初始化后,其他未初始化的数据会默认初始化为0;而当都没有进行初始化时,不会默认初始化为0。定义数组的大小时,推荐使用宏定义数组的大小,这一样以来,如果需要改变数组的大小时,不需要去所有调用到数组的部分去修改,只需要修改一下宏定义就可以了。支持C99规范的编译器可以支持数组的部分数据初始化,原创 2013-09-21 14:41:42 · 1077 阅读 · 0 评论 -
struct的使用
struct SS { int a; char b;};void main(){ SS s; SS *ps; s.a = 0; s.b = 'b'; ps = &s; printf("%d,%c\n%d,%c\n",s.a,s.b,ps->a,ps->b);}指针用->,对象用.原创 2013-08-16 09:46:39 · 595 阅读 · 0 评论 -
struct 和 typedef struct
分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明) 这里的Stu实际上就是转载 2013-08-14 09:39:31 · 609 阅读 · 0 评论 -
CRC循环冗余校验
转自:http://www.cnblogs.com/sujz/archive/2011/05/19/2051470.html原理:要计算n位的CRC值,将待CRC的数据左移n位(即在其最右端添加n个0),如果待CRC数据的最高位为0,不进行任何操作,否则将其与事先设定好的除数(divisor)进行异或操作,然后将除数右移一位。重复上述两个操作直到除数到达待CRC数据的右端。举例如下:转载 2013-07-30 13:32:11 · 809 阅读 · 0 评论 -
数组初始化
static char c[10],这时默认初始化为才c[0]='\0',c[1]='\0',...c[9]='\0';char c[10],这时默认是未知的。原创 2013-07-12 21:44:19 · 501 阅读 · 0 评论 -
union和struct的区别
原创 2013-04-16 20:55:20 · 675 阅读 · 0 评论 -
const修饰
原创 2013-04-15 20:48:57 · 477 阅读 · 0 评论 -
printf 格式
来自于百度百科:用法int printf(const char *format,[argument]);format 参数输出的格式,定义格式为:%[flags][width][.perc][F|N|h|l]type规定数据输出方式,具体如下: 1.type 含义如下: d 有符号10进制整数 i 有符号10进制整数 o 无符号8进制整数 u 无符号10进制转载 2013-03-22 23:23:07 · 634 阅读 · 0 评论 -
关键字static,const,volatile,auto,register
1、关键字static的作用:(1)定义静态局部变量,作用域从函数开始到结束,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。(2)在模块内的static函数只被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内。(3)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其他函数访问。(4)在类中的static成员原创 2013-03-12 14:14:29 · 625 阅读 · 0 评论 -
数据类型的范围
看下面四段程序:#includeusing namespace std;int main(){ short a = 0x8000; short b = 0x7fff; short c = a+b; cout return 0;}输出结果为:c = -1#include原创 2013-03-11 11:10:11 · 549 阅读 · 0 评论 -
关于strlen 和 sizeof
根据以下一段程序:#include#includevoid main(){char *str1 = "hello";char str2[]= "hello";printf("strlen of str1 = %d, sizeof str1 = %d \n",strlen(str1),sizeof(str1));printf("strlen of str2 = %d,原创 2013-03-11 10:57:50 · 519 阅读 · 0 评论 -
Youcompleteme插件使用条件编译(CompileFlags)去除警告和错误
粘贴一个我目前用的配置文件这个配置文件是使用vim编写stm32程序,并使用标准库的一个配置文件,相应的路径需要配置正确,否则会出现找不到头文件的错误提示;其中红色部分是用户自己define的预编译符号(即IAR开发环境中是comile--processer--defined symbol);当然这个配置中有好多没有用的FLAGS,我也不晓得删除哪个,目前不影响正常使用及语义补全,我就原创 2015-01-20 17:01:34 · 5402 阅读 · 0 评论