float a; int b=10; a=b/3; 左边是3.00000; 右边是3;其中有个匿名变量,先找一个内存空间,里面存 b/3; 然后把它再转换成float型,再赋值个a;最后匿名值销毁。
8.9.2 分析DEBUG宏
学习级: #define DEBUG #undef DEBUG 是注销 DEBUG 宏
#ifdef DEBUG
#define debug(x) printf(x)
#else
#define debug(x)
#endif
应用级: { #ifdef DEBUG
#define DBG(...) fprintf(stderr, " DBG(%s, %s( ), %d): ", __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, __VA_ARGS__)
#else
#define DBG(...)
#endif
解 释:<1>...表示变参,提示编译器不要对参数个数斤斤计较,不要报错; 其实完全可以把 ...换成 cdw 也是可以的,只是非要装一下逼而已。
<2> _FILE_ 和 _FUNCTION_和 _LINE_ 都是c库函数的宏定义,分别表示要输出的这句话属于哪个文件名、属于哪个函数名、在第几行。
<3> 在 fprintf(stderr,"cdw");其中stderr是c库函数中宏定义了的,这是VC6.0找到的 #define stderr (&_iob[2]) ;也就是说stderr是一个被宏定义了的指针,它是标准错误输出流对象(stderr),输出到屏幕上。
fprintf是C/C++中的一个格式化写—库函数,位于头文件中,其作用是格式化输出到一个流/文件中;(重点是流/文件)
printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出(重点是标准输出设备,有时候输出的不一定显示在屏幕上,只是编译器规定显示到屏幕上而已。)
总结:也就是说printf()其实不是输出屏幕上的,只是这个标准输出设备中,编译器规定显示到屏幕上而已,而真正输出到屏幕是fprintf(stderr,"cdw");其中stderr就是输出到屏幕上的流。它也可以 fprintf( FILE *stream, const char *format,...),这个就是输出到文件流中的。
比如:一般情况下,你这两个语句运行的结果是相同的,没有区别,只有一下情况才有区别:运行你的程序的时候,命令行上把输出结果进行的转向,比如使用下面的命令把你的程序a.c运行的结果转向到记事本文件a.txt:a.exe > a.txt
在这样的情况,如果使用printf输出错误信息,会保存到a.txt文件里面,如果使用fprintf输出错误,会显示在屏幕上。
<4>上面中的__VA_ARGS__也是一个宏定义,表示预处理时实际的参数。
如:DBG("tiaoshi.\n");
则允许的效果是 DBG(debug.c, main( ), 14): tiaoshi.
内核级: {#ifdef DEBUG_S3C_MEM
#define DEBUG(fmt, args...)printk(fmt, ##args)
#else
#define DEBUG(fmt, args...)do {} while (0)
#endif
}
九、链表&状态机与多线程(9.9.1?具体链表实现留到驱动模块讲解)
{
9.1、链表是一个一个的节点,每一个节点分为两部分,一部分是数据区(可以由多个类型的数据),另一部分是指向下一个节点的指针;结构体定义里面的变量并没有生成,是不占空间的,相当于声明的作用。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33816-17.html
有多少项多少项成果
人家是公民
消灭一切反对派