【问题标题】:Is EOF guaranteed to be -1?EOF 是否保证为-1?
【发布时间】:2014-03-02 00:59:40
【问题描述】:

在用 C 语言编写代码时,交替使用 -1EOF 是不是很好?标准是否保证EOF-1?还是定义了价值实现?

例如,如果一个函数在某些情况下返回EOF,那么测试该函数是否返回-1是一种好方法吗?

如果某个函数在某些情况下返回-1,那么测试该函数是否返回EOF是一种好方法吗?

【问题讨论】:

  • 你检查......无论该方法的文档告诉你它返回什么。
  • 幻数从来都不是好风格。如果有可用的命名常量,请使用它。
  • @Andres 正确,你错了;)没有EOF“字符”;它是从函数返回的特定值,指示已到达输入的末尾。
  • @David:如果文档没有提到EOF,请不要使用EOF
  • 无论该代码的作者是谁,它都违反了抽象的基本原则。功能是什么?返回值是否表示输入流的结束?毕竟,这就是 EOF 的意思。充其量这只是作者的一个大脑放屁。 不要效仿它!

标签: c standards standards-compliance language-implementation


【解决方案1】:

不,EOF 肯定不能保证是-1

这是一个宏,定义在<stdio.h>

扩展为整数常量表达式,类型为 int 和 负值,由多个函数返回以指示 文件结束,即不再有来自流的输入

(引自 ISO C 标准的第 7.21.1 节)。

我从未见过EOF 的值不是-1 的实现——但后来我懒得去检查了。

使用EOF 而不是文字-1 可以避免在选择不同负值的实现上导致代码中断,但更重要的是,读者清楚这一点。如果我在您的代码中看到-1,我将不确定您为什么选择该特定值。如果我看到EOF,我完全知道你的意思。 (即使标准要求 EOF 具有值 -1,这也适用。)

对于一般的“幻数”,有时它们是不可避免的。 cmets 中的一个示例:getopt 函数是 documented 在某些情况下返回-1,因此您应该将其结果与-1 进行比较,而不是与EOF 进行比较。尽可能避免使用幻数,但如果文档使用它们,你就会被它们困住。

【讨论】:

  • 我对第二个问题中的“幻数”问题感兴趣。我特别在考虑 getopt 函数,如果没有剩余选项,它会返回 -1,测试 EOF 是不是很好?
  • @David:getopt 的文档说它在某些情况下会返回-1,因此您应该将结果与-1 进行比较。如果声明getopt 的标头定义了一个命名常量,那就太好了,但它没有。如果记录了一个函数返回EOF,则将其结果与EOF 进行比较。如果您的代码依赖于具有特定值的 EOF,那么这就是您的代码中的问题。
  • "... 是测试 EOF 的好方法吗?" - 不,它甚至都不正确。只有当官方 POSIX 文档声明该函数返回(标准)EOF 时,这才是好的风格。
  • 通过谷歌搜索,显然 getopt 被记录为最初返回 EOF,但这在 1992 年被更改。例如,参见 pubs.opengroup.org/onlinepubs/009695399/functions/getopt.html 的 RATIONALE 部分
  • @David 另请参阅mirbsd.org/htman/i386/man3/getopt.htm 中的错误" getopt() 函数曾经被指定为返回 EOF 而不是 -1。这已由 IEEE Std 1003.2-1992 ("POSIX.2")将 getopt() 从 中解耦。"
猜你喜欢
  • 2016-10-29
  • 2016-05-21
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
相关资源
最近更新 更多