传递无效指针时,ferror(FILE *)和std :: ferror(FILE *)的行为是什么?

jot*_*tik 3 c c++ std libc language-lawyer

是什么行为::ferror(FILE *),并std::ferror(FILE *)在传递无效指针?

C ++标准仅指C(请参阅草稿)。但是在C标准中,在ferror功能说明下没有提及有关NULL传递无效指针或传递指针时会发生的情况。

我的理解是,根据与C草案N1570 §7.21.3.4:

FILE关闭关联文件(包括标准文本流)后,指向对象的指针的值不确定。

但这不应该阻止检查给定FILE *指针(不确定)是否指向有效FILE对象的实现。¹

无论哪种方式,这些标准甚至都没有对这是未定义的行为,实现的定义还是其他内容保持沉默。


¹例如,fopen()可以将返回的指针存储在某个全局集中(例如std::set<FILE *>),ferror()然后类似的函数可以检查其参数是否包含在该集中,并另外fclose()将其从该集中删除。

jot*_*tik 6

根据C草案N1570§4.2,遗漏被视为未定义的行为(添加了强调):

如果违反了在约束或运行时约束之外出现的“应”或“不应”要求,则该行为未定义。未定义的行为在本国际标准中通过``未定义的行为''一词或通过省略行为的任何明确定义来表示。这三个重点之间没有差异。它们都描述“未定义的行为”。

感谢Peter在对问题的评论中对此进行了描述。