freopen的签名是FILE * freopen ( const char * filename, const char * mode, FILE * stream )
根据文档,返回值与stream
的设置相同。所以,我的代码已经检查stream != 0
,我是否需要检查返回值? stream == 0
但retval != 0
怎么样?如果我不需要同时检查两者,如果我不检查retval,为什么gcc会给我一个警告?
要安静gcc,可以简单地执行:stream = freopen(filename, mode, stream); if (!stream) {...})
?
答案 0 :(得分:5)
如果失败了,它不会将原始流变量(它没有引用,因为参数为FILE *
而不是FILE **
)神奇地设置为NULL,所以你确实需要检查返回值。
答案 1 :(得分:4)
你说:
根据文档,返回值与设置的流相同。
不符合http://en.cppreference.com/w/c/io/freopen
返回值
1)成功时流的值的副本,失败时为空指针。
你问:
我需要检查返回值吗?
是的,你应该,永远。由于freopen
可能失败的所有原因fopen
可能会失败 - 权限,不存在的目录,打开的文件太多等等。最好始终检查{{1}的返回值在你使用它之前。