Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C EOF是否保证为-1?_C_Standards_Standards Compliance_Language Implementation - Fatal编程技术网

C EOF是否保证为-1?

C EOF是否保证为-1?,c,standards,standards-compliance,language-implementation,C,Standards,Standards Compliance,Language Implementation,在用C编写代码时,交替使用-1和EOF是好的风格吗?标准是否保证EOF为-1?还是定义了价值实现 例如,如果某个函数在某些情况下返回EOF,那么测试该函数是否返回了-1是一种好的方式吗 如果函数在某些情况下返回-1,那么测试函数是否返回了EOF是一种好的方式吗?否,EOF肯定不能保证为-1 这是一个宏,定义在 它扩展为整型常量表达式,类型为int和 负值,由多个函数返回以指示 文件结尾,即不再从流中输入 引用ISO C标准第7.21.1节 我从来没有见过EOF的值不是-1的实现,但是我没有费心去

在用C编写代码时,交替使用-1和EOF是好的风格吗?标准是否保证EOF为-1?还是定义了价值实现

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

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

否,EOF肯定不能保证为-1

这是一个宏,定义在

它扩展为整型常量表达式,类型为int和 负值,由多个函数返回以指示 文件结尾,即不再从流中输入

引用ISO C标准第7.21.1节

我从来没有见过EOF的值不是-1的实现,但是我没有费心去检查

使用EOF而不是literal-1可以避免在选择不同负值的实现上出现代码中断,但更重要的是,读者很清楚这一点。如果我在您的代码中看到-1,我将无法确定您为什么选择该特定值。如果我看到EOF,我完全明白你的意思。即使标准要求EOF的值为-1,这也适用


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

您可以检查。。。不管这个方法的文档告诉你什么,它都会返回。幻数永远都不是好的样式。如果有一个命名常量可用,请使用它。@Andres Correct,你错了;没有EOF字符;它是从函数返回的一个特定值,表示已到达输入的结尾。@David:如果文档中没有提到EOF,请不要使用EOF。无论该代码的作者是谁,这都违反了抽象的基本原则。功能是什么?返回值是否表示输入流结束?毕竟,这就是EOF的意思。充其量,这只是作者的大脑放屁;不要模仿它!我对第二个问题中的“幻数”问题感兴趣。我特别考虑了getopt函数,它在没有剩余选项的情况下返回-1,测试EOF是否是一种好的方式?@David:getopt的文档说明它在某些情况下返回-1,因此您应该将结果与-1进行比较。如果声明getopt的头定义了一个命名常量就好了,但是它没有。如果一个函数被记录为返回EOF,则将其结果与EOF进行比较。如果您的代码依赖于具有特定值的EOF,那么这就是代码中的一个问题。。。。测试EOF-No是一种好的方式吗?它甚至都不正确。只有当POSIX官方文档声明函数返回标准EOF时,这才是好的风格。通过谷歌搜索,显然getopt最初被记录为返回EOF,但这在1992年被更改。例如,请参见@David的“基本原理”部分,也可以参见getopt函数中的bug,它曾经被指定为返回EOF而不是-1。IEEE Std 1003.2-1992 POSIX.2对此进行了更改,以将getopt与。