gpt4 book ai didi

c - 为什么 fputc() 而不是 putc()?

转载 作者:太空宇宙 更新时间:2023-11-04 08:49:44 25 4
gpt4 key购买 nike

getc()fgetc()

putc()fputc()

它们之间的主要区别是什么?

我听说除了 getc() 可以用作宏之外,这两个函数的作用几乎相同。这是什么意思?

如果它们相同,为什么要使用两个函数来做同样的事情?

如有任何帮助,我们将不胜感激?

最佳答案

首先,printf 与 fprintf 不同:fprintf 支持文件参数,printf 转到标准输出。

使用 fputc 和 fgetc 的原因是,在历史实现中,putc 和 getc 是不止一次评估参数的宏版本。例如,the version on Unix V7 :

#define getc(p)   (--(p)->_cnt>=0? *(p)->_ptr++&0377:_filbuf(p))
#define putc(x,p) (--(p)->_cnt>=0? ((int)(*(p)->_ptr++=(unsigned)(x))):_flsbuf((unsigned)(x),p))

其中的每个“p”都被替换为您在参数中输入的表达式 - 所以如果它有副作用(比如您调用函数来获取文件,或者正在使用++ 遍历文件列表运算符),它将被多次调用,并可能对不同的文件进行操作。

一些现代系统(例如 FreeBSD 或 OSX)仍然这样做,但通常只是在“解锁”版本中,因为标准的 getc/putc 函数必须是线程安全的。未锁定的版本用于库函数内部的性能,因此仅在库函数的顶部获取一次锁(这样当您调用 printf 时,它不必调用 fputc 数百次,每次都执行一次锁时间)。

关于c - 为什么 fputc() 而不是 putc()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20106401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com