【发布时间】:2017-04-04 16:39:39
【问题描述】:
C 标准使用以下语言定义 EOF 和 WEOF:
7.21.1 输入/输出
- 简介 头文件
<stdio.h>定义了几个宏,并声明了三种类型和许多函数用于执行输入和输出。...
EOF它扩展为一个整数常量表达式,类型为 int 和一个负值,由多个函数返回以指示文件结束,即不再有来自流的输入;
...
7.21.1 扩展的多字节和宽字符实用程序
- 简介: 标题
<wchar.h>定义了四个宏,声明了四种数据类型,一个标签,多个函数。...
wint_t这是一个默认不变的整数类型,参数promotions可以保存任何对应于扩展字符集成员的值,以及至少一个不对应于任何扩展字符集成员的值
WEOF扩展为 wint_t 类型的常量表达式,其值不对应于扩展字符集的任何成员。(328) 本子条款中的几个函数接受(并返回)它以指示文件结束,也就是说,不再有来自流的输入。它也用作不对应于扩展字符集的任何成员的宽字符值。
- 宏 WEOF 的值可能与 EOF 的值不同,不必为负。
EOF 是一个负值,它是getc() 唯一可以返回的负值。我看到它通常定义为(-1),同样WEOF 定义为((wint_t)-1)。
是否有任何常见的 C 环境将这些宏中的任何一个定义为不同的东西?
标准委员会保留不同值的可能性的理由是什么,尤其是WEOF 的非负值?
【问题讨论】:
-
这也很大程度上取决于
wint_t的定义。例如,如果是unsigned short和sizeof(int) > sizeof(unsigned short),则为EOF != WEOF(它与符号扩展有关,或者更确切地说是缺少符号扩展)。 -
何必呢?使用宏而不是幻数是一种很好的做法,并且无论如何都会使代码更清晰。回覆。
wint:IIRC,Windows 有 16 位wchar_t,它需要所有 16 位来表示字符。允许WEOF的非负值将允许为标记保留单个代码,而不是可用代码空间的一半。 -
假设,一个实现可能对
-1作为字符代码有一些合法用途,因此可能希望为EOF选择一个不同的值。
标签: c macros language-lawyer eof