2015-11-15 31 views
0

的簽名freopen函數是FILE * freopen (const char * filename, const char * mode, FILE * stream)C - 是否需要檢查freopen返回值?

根據該文件,返回值是一樣的東西stream設置爲。所以,我的代碼已經檢查stream != 0,我需要檢查返回值嗎? stream == 0但是retval != 0?如果我不需要檢查兩者,爲什麼如果我不檢查retval,gcc會給我一個警告?

要安靜的gcc,可以簡單地做:stream = freopen(filename, mode, stream); if (!stream) {...})

+0

我不確定你是怎麼使用它的,但freopen()函數的主要用途是改變與標準文本流('stderr','stdin'或'stdout')相關的文件。 –

+0

如果不需要檢查返回值,則不需要函數返回值。既然如此,答案很清楚*是的,你需要檢查它*。 –

回答

5

如果失敗,它不會奇怪地將原始流變量(它沒有引用,因爲參數是FILE *而不是FILE **)設置爲NULL,所以您確實需要檢查返回值。

4

你說:

根據該文件,返回值是一樣的東西流設置爲。

未按http://en.cppreference.com/w/c/io/freopen

返回值
1)流的成功,失敗空指針的值的副本。

你問:

,我需要檢查返回值?

是的,你應該,永遠。 freopen可能會因爲fopen可能失敗的所有原因而失敗 - 權限,不存在的目錄,打開的文件過多等。在使用之前始終檢查返回值freopen是一種好習慣。