为什么C I / O功能之间不一致?

时间:2016-11-15 20:59:06

标签: c language-design

一致性是代码库中的基本属性,更不用说最终被证明是世界上使用最多的编程语言。

C语言中有两类I / O函数:格式化和未格式化。这些是:

int fprintf(FILE *stream, const char *format, ...);
int vfprintf(FILE *stream, const char *format, va_list ap);

int fputc(int c, FILE *stream);
int fputs(const char *s, FILE *stream);
int putc(int c, FILE *stream);

*fprintf似乎用于(where, what)排序,而*put*用于(what, where);同样适用于输入功能。为什么 stream 参数位于不同位置?这种选择有没有历史 / 设计动机?

1 个答案:

答案 0 :(得分:1)

fprintf系列没有好的选择,因为采用变量参数列表的函数需要在可变参数部分之前采用其参数的“固定”部分:

  • stream中间粘贴fprintf(const char *format, FILE *stream, ...)将与printf不一致,其中格式化的值会立即跟随格式字符串。它也会与fputc家庭保持一致。
  • stream粘贴到可变参数部分,就像在fprintf(const char *format, ...)中一样,理论上是可行的,但效率很低,因为在开始写入之前需要先找到最后一个参数流。
另一方面,

fputc家庭可以改写为fputc(FILE *stream, int c)。但是,它的前身putc在K& R书的原始版本中被提及(pdf,滚动到第152页)所以标准的作者在添加无宏时决定坚持惯例fputc函数库。