关于printf函数的所思所想

缘起大一下学期,C语言程序设计徐小青老师的随口一提,经娄嘉鹏老师提醒,我觉得应该自己整理清楚这一问题。涉及网上资料将会标明出处。

关于printf函数的所思所想


* printf的定义

printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。
格式输出,它是c语言中产生格式化输出的函数(在 stdio.h 中定义)。用于向终端(显示器、控制台等)输出字符。
格式控制由要输出的文字和数据格式说明组成。

原型:extern int printf(const char *format,...);

**参考百度百科词条 http://baike.baidu.com/view/410546.html **

* printf函数-c源码

从课程原因角度考虑,我搜索了一下printf函数的c源码。

    ...
    switch (cntrl_string[pos]) {  
    case 'c':  
    putchar (va_arg (ap, unsigned char));  
    cnt_printed_chars++;//已经被printf输出的字符个数  
    break;  
    ...  
    case 's':  
    chptr = va_arg (ap, unsigned char*);//cnptr是用来在处理字符串时的位置指针  
    i = 0;  
    while (chptr [i]) {  
    cnt_printed_chars++;  
    putchar (chptr [i++]);}  
    break;  
    ...  

在上述代码中引用了 int putchar (int c),同样以switch-case语句为主体,
至于void printChar (const byte ch),个人还看不懂

**参考sgq116300博客 http://blog.csdn.net/sgq116300/article/details/1863384 **

另一个版本在linux内核中的printf源码,仅用了252行

**参考ChinaUnix博客 http://blog.chinaunix.net/uid-24567872-id-87686.html **

* printf函数-汇编语言代码

因为徐小青老师课上同样提到了汇编语言,这也是信息安全专业的课程之一。在程序设计课程中使用的codeblock已经用编译器完成了汇编。
在知乎网友Milo Yip关于“学习汇编有什么好处”的回答中提到,
“汇编是一般程序員能为机器编程的底层语言(现代的CPU/GPU还会把指令再分解成微指令),所以学习汇编能让程序員知道机器在软件层面上的最底层操作。”

在博友范志东(Florian)的《printf背后的故事一文中》,详细的描述了printf的调用轨迹,但因为个人能力有限我没有看懂glibc源代码中的printf源码。
仅就函数调用做了记录:
_IO_puts => _IO_sputn => _IO_XSPUTN => __xsputn => _IO_file_xsputn => _IO_new_file_xsputn
=> _IO_OVERFLOW => __overflow => _IO_new_file_overflow
=>_IO_do_write =>_IO_new_do_write
=> new_do_write
=>_IO_SYSWRITE => __write() => write() => _IO_new_file_write
=>write_not_cancel => write_nocancel
=> INLINE_SYSCALL  => INTERNAL_SYSCALL =>__kernel_vsyscall
**参考Florian博客 http://www.cnblogs.com/fanzhidongyzby/p/3519838.html **


综上分析:徐小青老师提及的上千行代码可能指的是汇编语言下的printf函数代码。

posted @ 2016-12-11 12:09  曾士轩  阅读(342)  评论(5编辑  收藏  举报