Linux兴趣小组暑假留校第四次讲座总结
2016-07-29 17:29
176 查看
printf的实现
Makefile
int _cdecl printf(const char* format, …);
_cdecl是C和C++程序的缺省调用方式
_CDEDL调用约定:
1.参数从右到左依次入栈
2.调用者负责清理堆栈
3.参数的数量类型不会导致编译阶段的错误
对于x86而言,栈向下生长,函数参数从右向左入栈,因此从第一个固定参数(format)地址向前(向上)移动就可得到其他变参的地址。
va_list相关宏(VC++中stdarg.h里x86平台的宏定义)
typedef char * va_list;
//_INTSIZEOF(n)宏:将sizeof(n)按sizeof(int)对齐。
//取format参数之后的第一个变参地址,4字节对齐
//对type类型数据,先取到其四字节对齐地址,再取其值
如何得到参数个数?
其实printf并不知道参数个数,它只是逐个解析format字符串。对于特定类型%,使用va_arg去取相应参数的值,直到遍历字符串结束。类似于如下代码:
如下调用会打印什么内容?
printf(“%x”);
(1)一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的
规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂
的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
(2)所要完成的Makefile 文件描述了整个工程的编译、连接等规则。其中包括:工程中的哪些源文件需要编译
以及如何编译、需要创建那些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。
尽管看起来可能是很复杂的事情,但是为工程编写Makefile 的好处是能够使用一行命令来完成“自动化编
译”,一旦提供一个(通常对于一个工程来说会是多个)正确的 Makefile。编译整个工程你所要做的唯一
的一件事就是在shell 提示符下输入make命令。整个工程完全自动编译,极大提高了效率。
(3)make是一个命令工具,它解释Makefile 中的指令(应该说是规则)。在Makefile文件中描述了整个工程所
有文件的编译顺序、编译规则。Makefile 有自己的书写格式、关键字、函数。像C 语言有自己的格式、关
键字和函数一样。而且在Makefile 中可以使用系统shell所提供的任何命令来完成想要的工作。
Makefile(在其它的系统上可能是另外的文件名)在绝大多数的IDE 开发环境中都在使用,已经成为一种
工程的编译方法。
Makefile
printf的实现
printf的声明int _cdecl printf(const char* format, …);
_cdecl是C和C++程序的缺省调用方式
_CDEDL调用约定:
1.参数从右到左依次入栈
2.调用者负责清理堆栈
3.参数的数量类型不会导致编译阶段的错误
对于x86而言,栈向下生长,函数参数从右向左入栈,因此从第一个固定参数(format)地址向前(向上)移动就可得到其他变参的地址。
va_list相关宏(VC++中stdarg.h里x86平台的宏定义)
typedef char * va_list;
//_INTSIZEOF(n)宏:将sizeof(n)按sizeof(int)对齐。
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
//取format参数之后的第一个变参地址,4字节对齐
#define va_start(va_list ap, format) ( ap = (va_list)&format+ _INTSIZEOF(format) )
//对type类型数据,先取到其四字节对齐地址,再取其值
#define va_arg(va_list ap,type) ( *(type*)((ap += _INTSIZEOF(type)) -_INTSIZEOF(type)) )
#define va_end(va_list ap) ( ap = (va_list)0 )
如何得到参数个数?
其实printf并不知道参数个数,它只是逐个解析format字符串。对于特定类型%,使用va_arg去取相应参数的值,直到遍历字符串结束。类似于如下代码:
#include <stdio.h> #include <stdarg.h> void myprintf(const char *format, ...) { va_list ap; char ch; va_start(ap, format); while(ch = *format++) { switch(c) { case 'c': { char ch1 = va_arg(ap, char); putchar(ch1); break; }
如下调用会打印什么内容?
printf(“%x”);
Makefile
1.什么是Makefile(1)一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的
规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂
的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
(2)所要完成的Makefile 文件描述了整个工程的编译、连接等规则。其中包括:工程中的哪些源文件需要编译
以及如何编译、需要创建那些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。
尽管看起来可能是很复杂的事情,但是为工程编写Makefile 的好处是能够使用一行命令来完成“自动化编
译”,一旦提供一个(通常对于一个工程来说会是多个)正确的 Makefile。编译整个工程你所要做的唯一
的一件事就是在shell 提示符下输入make命令。整个工程完全自动编译,极大提高了效率。
(3)make是一个命令工具,它解释Makefile 中的指令(应该说是规则)。在Makefile文件中描述了整个工程所
有文件的编译顺序、编译规则。Makefile 有自己的书写格式、关键字、函数。像C 语言有自己的格式、关
键字和函数一样。而且在Makefile 中可以使用系统shell所提供的任何命令来完成想要的工作。
Makefile(在其它的系统上可能是另外的文件名)在绝大多数的IDE 开发环境中都在使用,已经成为一种
工程的编译方法。
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- Linux 下无损图片压缩小工具介绍