【问题标题】:Why does fopen() use strings instead of enums? [duplicate]为什么 fopen() 使用字符串而不是枚举? [复制]
【发布时间】:2019-12-30 03:29:48
【问题描述】:

在 C 语言中,要指定打开文件的方式,请使用字符串,例如 "r""w" 等。为什么不用 enum?枚举可以与 switch 语句一起使用,因此它们会运行得更快。为什么fopen 使用字符串而不是enum?问题很简单。

【问题讨论】:

  • 天啊...不,C++ 本身并没有任何东西使它比 C 慢。
  • 但是文件模式不仅仅是一个字符 - 允许有多种组合,例如“wb”或“ta+”。
  • 这个问题基本上是无法回答的;这是 70 年代中后期做出的决定,并一直持续至今。那个时代的open() 调用非常简单,选项很少;它现在有无数的选项(POSIX open() 列出了 18 个选项)。字符串非常灵活,并且在必要时更容易扩展,但当然标准没有太大变化(请查看 C11 的附件 K §K.3.5.2.1 The fopen_s function)。
  • “快得多”是一种误解。这里可能的性能差异与fopen 执行操作的时间成本之间存在多个数量级。
  • @AnttiHaapala — 我不记得我写的每一个答案,恐怕 — 十年是很长的时间!

标签: c string enums fopen


【解决方案1】:

因为fopen可以用标志的组合来调用,例如:

FILE *fp = fopen("MyFile", "wb+");

您可以通过|'将二进制标志组合在一起来实现类似的效果,替代界面可能如下所示:

FILE *fp = fopen("MyFile", F_WRITE | F_BINARY | F_UPDATE);

或者类似的东西,但这比使用字符串更笨重,不是吗?

在任何情况下,枚举都不适合,因为您必须为每个可能的选项组合使用唯一的枚举,这绝对更笨重,更难编写实现代码。

【讨论】:

  • 它不起作用
  • F_WRITE 未声明标识符
  • 不,您不必为每个可能的组合使用单独的枚举;您可以使用enum { O_RDONLY = 0, O_WRONLY = 1, O_RDWR = 2, O_EXCL = 4, O_TRUNC = 8, … };,然后按照您显示的方式组合这些值。请注意,O_RDONLY 传统上为 0,并且不能与 O_WRONLY 组合以获得 O_RDWR,但与 open() 关联的其余值可以是枚举——除了 POSIX 要求 值应为按位区分,应适用于#if 预处理指令,枚举不适用于#if
  • @SomeRando:答案是建议一个可能的替代接口,但该替代接口不存在——因此你不能使用它。
  • @SomeRando 我只是在演示如果他们使用标志路由而不是字符串,界面可能会是什么样子。但是那个接口不存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 2018-09-15
  • 2011-10-22
  • 1970-01-01
相关资源
最近更新 更多