为什么putc()时fputc()?

时间:2013-11-20 20:32:16

标签: c

getc() vs fgetc()

putc() vs fputc()

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

我听说两个函数几乎完全相同,只是getc()可以用作宏。这是什么意思?

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

任何帮助都会受到重视?

3 个答案:

答案 0 :(得分:2)

首先,printf vs fprintf是不同的:fprintf支持文件参数,printf转到stdout。

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数百次,每次执行锁定时间)。

答案 1 :(得分:0)

根据Kernighan的书,putc相当于fputc,但putc可以实现为宏,putc可以不止一次地评估它的流参数。

putc和fputc之间的区别在于,通过使用putc,您可能会冒运行本质上不安全的宏版本,因为它可能不得不多次评估其流参数。这导致大多数人不知道的并发症,因此不注意,因此fputc更好用。 fputc的宏没有这个问题。

答案 2 :(得分:0)

至少对于fprintf()来说显而易见,因为可以指定要写入的FILE*printf()打印到stdout

其他2X2功能在使用方面确实是等价的。