C/C++
文章平均质量分 67
huangjiayun1226
这个作者很懒,什么都没留下…
展开
-
IAR 430 头文件中#define定义的部分解释
<br />今天在阅读RF_Example_Code_v1.0中头文件cc430x613x.h时发现了几部分的疑问。<br />首先来看一下cc430x613x.h 中的3个#define的例子:<br />#define DEFC(name, address) __no_init volatile unsigned char name @ address;<br /><br />#define DEFW(name, address) __no_init volatile unsigned short na原创 2010-07-22 15:20:00 · 3688 阅读 · 1 评论 -
ANSI C 自动将相邻的字符串常量合并埋下的BUG
<br />ANSI C 自动将相邻的字符串合并起来,但是这也给程序埋下了晦涩的bug,假如在你遗漏了“,”(逗号)的时候,这将是地狱开门的时候。<br /> <br />以下是一段示例程序,将有助于你理解这个bug的伏笔<br /> <br />#include "stdio.h"<br />int main(int argc, char* argv[])<br />{<br /> printf("Hello World!/n");<br /> //session 1:输出毗邻的三个常量字符串,ANSI原创 2010-11-17 20:35:00 · 1695 阅读 · 1 评论 -
c 输出格林治时间和当前时间
<br />当我们使用ctime输出本地当前时间的时候,不知不觉却对后面的输出结果产生了影响。即使后面你再使用asctime(gmtime(time_t *))去输出格林治时间,得到的结果仍为本地当前时间。<br />正确的做法是,先输出格林治时间,再输出本地当前时间。(假设需要同时输出当前两个结果时)<br /> <br />以下是示例代码:<br />#include "stdio.h"<br />#include "time.h"<br />#include "malloc.h"<br />#incl原创 2010-11-17 11:20:00 · 2213 阅读 · 0 评论 -
结构体中位段用法
<br />在结构体中允许存在位段、无名位段以及字对齐所需的填充字段。但是位段的用法,本身就具有一定的限制性,并不是简单的分配,期间还需要考虑到字对齐。系统默认的字对齐是4字节字对齐。<br /> <br />以下的一段示例代码,将帮助你理解位段的用法:<br /> <br />#include "stdio.h"<br />//session 1:结构体内部进行位段分配,但是只是分配一个字用于字段分配<br />//大小为8个字节,4字节对齐<br />struct pid_tag_small{<br /原创 2010-11-18 12:05:00 · 2491 阅读 · 0 评论 -
const 基本用法
<br />关于const的用法,相信刚开始学习的时候总会有点糊涂,但是经过深入的学习和理解之后const的用法其实很简单。const是一个修饰符,所修饰的变量初始化之后就不允许第二次赋值修改。但是const指针的用法相信就会很让人糊涂。<br />以下是一段示例代码,相信认真查阅之后会对你的理解有更深入的帮助。<br /> <br />#include "stdio.h"<br />#include "malloc.h"<br />int main(int argc, char* argv[])<br /原创 2010-11-17 16:02:00 · 664 阅读 · 0 评论 -
c 优先级的问题举例
<br />关于C语言的优先级问题是比较混乱的,C语言本身关于某些优先级的设置是存在一定的问题的。<br />单靠语言本身去区分优先级,不是一种好的策略。下面关于space举一个例子。<br /> <br />以下是一段示例程序,可以帮助你的理解:<br /> <br />#include "stdio.h"<br />int main(int argc, char* argv[])<br />{<br /> printf("Hello World!/n");<br /> //maximal munch s原创 2010-11-17 21:56:00 · 605 阅读 · 0 评论 -
c 数组和指针的区别
数组和指针,相信大部分人会认为这是基本上相同的东西,可以互相交换使用。假如你有这种思想,那将为你后续的bug埋下伏笔。数组和指针的区别在多文件,extern外部变量时表达得淋漓尽致,只要不是类型一一对应的,都将会出错。假如运行直接内存错误挂掉了,你将庆幸问题暴露出来了。假如你使用的是下文所指的第三种第四种情况,那就没有那么庆幸了。bug已经悄悄的在你身边不定时的准备爆发了。以下是一段示例程序,将帮助你理解:a.cpp//声明变量int xx[100];int *x = xx;int y[100];int a原创 2010-11-19 00:44:00 · 917 阅读 · 1 评论 -
sizeof 计算出数组的长度
<br />通过sizeof可以计算出类型的长度,同样也可以计算出数组的长度,但是这具有一定的局限性。<br /> <br />以下是一段示例代码:<br />#include "stdio.h"<br />void Count_array_element_ptr(int *p){<br /> printf("%d/n",sizeof(p)/sizeof(p[0]));<br /> return ;<br />}<br />void Count_array_element_array(int array[]原创 2010-11-17 16:55:00 · 1127 阅读 · 0 评论 -
c 输出地址格式符%p
<br />c语言中,有常用的几种格式符,%o输出八进制,%d输出十进制,%x输出十六进制,%f输出浮点型数据,%c输出单个字符,%s输出字符串,%l输出长整型。但是也有稍微不是很常用的格式符,%p就是其中之一。相信大家在日常中使用得比较少,其实它的输出格式也是六进制,跟%x的区别在于,%p输出的长度是一致的8位16进制符(即32位2进制符)。<br /> <br />以下是一段示例程序,将帮助你理解%p的简单用法:<br /> <br />#include "stdio.h"<br /><br />int原创 2010-11-20 21:40:00 · 15269 阅读 · 1 评论 -
添加辅助代码
<br />相信大家在写代码的时候会发现,有时候我们需要往代码里面添加部分的辅助代码以帮助我们调试,但是在开发完成之后,有一部分的辅助代码将不会被编译到产品代码中。但是又需要将辅助代码和程序代码区分开来。传统情况下,会定义一个宏,在每次添加辅助代码的地方都会判断是否需要编译进去。但是这样子让程序看起来比较繁冗。而使用宏函数则能避免这种情况。<br />下面是一段示例程序,将帮助你理解:<br /> <br />#define DEBUG<br />//session 1:如果定义了DEBUG,则可以将函数宏原创 2010-12-31 23:08:00 · 1118 阅读 · 0 评论 -
c 判断变量是有符号数还是无符号数-判断标识符是有符号还是无符号
判断一个变量是有符号数还是无符号数,问题的本质是考察变量的类型,而不是数本身。相信大部分程序员知道有符号数和无符号数的区别在于最高位的作用,所以问题的突破口也是在最高位的判断上。但是变量存储的只是一串01,最后的解释在于编译器,所以需要依靠编译器来完成判断。即将最高位置0或1,变量的值都应该大于0。那么变量原来的类型必是无符号的。下面是一段示例程序,将帮助你理解:#include "stdio.h"//session 1: 判断变量是有符号还是无符号//主要判断依据为,根据编译器自身的解释原理来判断//无符原创 2010-12-09 22:34:00 · 2048 阅读 · 0 评论 -
c realloc实现动态增长内存块
<br />相信大部分程序员关于动态内存分配都比较熟悉,而动态增长内存可以实现更为便捷的内存管理。在c中realloc则可以实现这种想法。<br /> <br />以下是一段示例程序,将帮助你理解:<br />#include "stdio.h"<br />#include "malloc.h"<br />int current_element = 0;<br />int total_element = 2;<br />//session 1:动态分配内存<br />char *dynamic = (cha原创 2010-12-03 12:02:00 · 1331 阅读 · 1 评论 -
#define的部分用法:通过#define连接字符串
<br />最近看com相关的资料,看到CCmdTarget实现com接口的时候,去读了一些宏的定义,在afxdisp.h头文件中 <br />#define BEGIN_INTERFACE_PART(localClass, baseClass) /<br />class X##localClass : public baseClass / <br />本来这个宏定义很容易理解的,但是这里多出个X##,我真没见过这种用法,不晓得它是什么用意。<br />后来问了几个朋友也都不知道。 <br />你知道么?转载 2010-07-21 23:54:00 · 11000 阅读 · 0 评论 -
IAR 430 头文件中#define定义的部分解释
<br />今天在阅读RF_Example_Code_v1.0中头文件cc430x613x.h时发现了几部分的疑问。<br />首先来看一下cc430x613x.h 中的3个#define的例子:<br />#define DEFC(name, address) __no_init volatile unsigned char name @ address;<br /><br />#define DEFW(name, address) __no_init volatile unsigned short na原创 2010-07-22 15:20:00 · 1586 阅读 · 4 评论 -
0元素数组
<br />#include <stdio.h><br />#include <string.h><br />#include <stdlib.h><br />struct aa{ <br /> int a;<br /> int b;<br />};<br /><br />struct bb{ <br /> struct aa test[0];<br />};<br />int main(void)<br />{<br /> struct bb *p=(struct bb*)mall原创 2010-08-29 15:56:00 · 1036 阅读 · 0 评论 -
计算程序运行时间
<br />在长时间计算程序运行时间时,可以使用clock函数。clock比较通用,精度并不是特别的高,大约是10ms。但是对于长时间的计算的话,还是可以使用的。<br /> <br />以下是一段示例程序,将帮助你理解:<br /> <br />#include "stdio.h"<br />#include "memory.h"<br />#include "time.h"<br />#define SIZE (65535)<br />//使用两种方法进行内存copy<br />//session 1:原创 2010-11-28 15:56:00 · 493 阅读 · 0 评论 -
c 总线错误
可能使用vc的程序员对这个错误比较陌生,因为vc并不提示总线错误,而是直接得出程序.exe遇到问题需要关闭的提示框。简单的从这个层面说,并没有提供太多有用的信息。但是如果使用gcc的程序员可能就不会陌生了,因为总会提示bus error。事实上,总线错误几乎都是由于未对齐的读或写引起的。它之所以称为总线错误,是因为出现未对齐的内存访问请求时,被堵塞的组件就是地址总线。对齐的意思就是数据项只能存储在地址是数据项大小的整倍数的内存位置上。现代的计算机架构中,尤其是RISC架构,都需要字对齐,因为与任意的对齐有关原创 2010-11-28 17:08:00 · 2263 阅读 · 0 评论 -
段错误
<br />相信大多数在vc下的程序员不会对segmentation error太熟悉,因为vc下并没有给出具体的错误信息,只是在运行中给出提示框“程序.exe遇到问题需要关闭”。而且在编译过程中也没有给出任何的error和warning,相信vc在这方面稍微要薄弱一点。<br />庆幸在gcc则会给出具体的segmentation error。<br />其实通常的段错误都是由于解除引用一个未初始化或非法值的指针引起的。<br /> <br />下面是一段示例程序,将帮助你理解:<br /> <br />原创 2010-11-28 17:41:00 · 514 阅读 · 0 评论 -
c 向函数传递多维数组
<br />c中对多维数组的支持并不是特别的完美,导致了许多的操作对于新手来说晦涩难懂。当然如果只是从语法本身出发考虑是很难理解为什么需要这么做的,但是从编译器的角度出发恰好可以获取意想不到的效果。这起决于编译也需要一定的条件才能判断,而这个条件往往就是为什么这样子可以的原因。<br /> <br />向函数传递数组,相信会记起一条规则“数组名会被改写成一个指针参数”。但是这个规则并不是递归定义的。也就是说在一维数组时,数组名确实被改写成了指针参数。但是数组的数组则会被改写成“数组的指针”,而不是“指针的指原创 2010-12-03 10:26:00 · 3794 阅读 · 0 评论 -
c 数组和指针在函数参数中的转换
<br />相信刚接触c的人会认为,指针和数组是互换,但是很明显不是这样子的。之前曾经详细的罗列了数组和指针的区别。这里就不再详述了。<br /> <br />以下是一段示例程序,将帮助你理解数组在传递到函数参数中时发生的变化:<br /> <br />#include "stdio.h"<br />char g_a[] = "abcdefghi";<br />//session 1:参数使用数组<br />//由于编译器都会将形参中的数组转换成指针,所以打印出的地址是形参指针的地址<br />//其实也就原创 2010-12-02 23:13:00 · 949 阅读 · 0 评论 -
c setjmp 和 longjmp
<br />相信大家对goto不会太陌生,但是恐怕setjmp和longjmp就不是很熟悉了。<br /> <br />以下是一段示例程序,将帮助你理解:<br /> <br />#include "setjmp.h"<br /><br />//声明一个记录变量<br />jmp_buf buf;<br />void Banana(){<br /> printf("in banana()/n");<br /> //session 2:使用longjmp实现跳转回到buf记录的位置.且返回1<br /> lo原创 2010-11-20 22:55:00 · 666 阅读 · 0 评论