免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3946 | 回复: 6
打印 上一主题 下一主题

关于putchar和getchar的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-10 13:27 |只看该作者 |倒序浏览
在《C的缺陷与陷阱》书里说到putchar和getchar被实现为宏
这样可以节省系统调用的开销
putchar和getchar不是被宏定义成putc(c,stdout)和getc(stdin)么
那应该还是会要用到putc和getc的函数调用啊
怎么会节省系统调用的开销呢

小生愚顿 请各位大人指点 谢谢

论坛徽章:
0
2 [报告]
发表于 2006-08-10 16:15 |只看该作者
哪位好心人能帮忙解下疑惑
谢谢了...

论坛徽章:
0
3 [报告]
发表于 2006-08-10 16:34 |只看该作者
不就已经少了一层函数调用了吗?

论坛徽章:
0
4 [报告]
发表于 2006-08-10 16:53 |只看该作者
谢谢楼上的
但不太明白楼上的意思
比如在程序中 用getchar()这样一个宏;
在编译的时候用getch(stdin)这个函数替换了宏定义;
这和在程序中直接用getch(stdin)的过程不是一样吗?
怎么说少了一层函数调用呢...
就是这里搞不懂了..

论坛徽章:
0
5 [报告]
发表于 2006-08-10 18:51 |只看该作者
冒着被骂和被B4的危险
自己顶上去....
期待一个好的答案

[ 本帖最后由 iamfog 于 2006-8-10 19:34 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-08-10 20:34 |只看该作者
getc(stdin)典型的是个宏
如果缓冲中还有字符就取出来,并把缓冲中剩余的字符数减一,否则(没有了)就刷新(read)

论坛徽章:
0
7 [报告]
发表于 2006-08-11 19:46 |只看该作者
比如在程序中 用getchar()这样一个宏;
在编译的时候用getch(stdin)这个函数替换了宏定义;
这和在程序中直接用getch(stdin)的过程不是一样吗?


这跟
  1. int getchar(){
  2.     return getch(stdin);
  3. }
复制代码
这个实现相比,是少了一层函数调用啊。


putchar 和 getchar 是 C 标准,是必须实现的,也是为了方便,当然这样实现比较好了。

而且,putchar 和 getchar 很可能会有不同的实现,比如 winnt 中可能要实现 ansi 和 unicode 两个版本,win 和 linux 中的实现也有可能不同,这时我们就不能直接用 getc 。

下面是 win 的 stdio.h , 可以看出,它有两个版本的 putchar, 一个是函数调用的,一个是宏替换的。

  1. CONIO.H (80):_CRTIMP int __cdecl _putch(int);
  2. CONIO.H (103):_CRTIMP int __cdecl putch(int);
  3. STDIO.H (311):_CRTIMP int __cdecl fputc(int, FILE *);
  4. STDIO.H (312):_CRTIMP int __cdecl _fputchar(int);
  5. STDIO.H (330):_CRTIMP int __cdecl putc(int, FILE *);
  6. STDIO.H (331):_CRTIMP int __cdecl putchar(int);
  7. STDIO.H (427):#define putc(_c,_stream)  (--(_stream)->_cnt >= 0 \
  8. STDIO.H (430):#define putchar(_c)       putc((_c),stdout)
复制代码

[ 本帖最后由 VirusCamp 于 2006-8-11 19:47 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP