2010-02-13 70 views
0

爲什麼此代碼會產生警告?返回文件*

FILE* my_open_file(char* filename) 
{ 
    FILE* fp=fopen(filename,"r"); 
    if(fp==NULL) 
    { 
     perror("Error opening file"); 
     return -1; 
    } 
    return fp; 
} 
  • asdf.c:在函數 'my_open_file':
  • asdf.c:9:警告:返回時將整數 指針不進行強制轉換

FP已經是一個指針,而且據我所知,不是整數。

+3

fp是一個指針,但-1不是。相反,在兩種情況下都返回fp。 – 2010-02-13 18:29:41

回答

7

編譯器不喜歡return -1,它的類型是int但是my_open_file應該返回指針到FILE

使用return NULL;來表示錯誤。

+0

或者只是一個'return fp;',因爲'fp'已知爲NULL。 – 2010-02-13 19:13:19

2

我認爲這個預警點返回-1

而不是僅僅用「返回NULL」

0

你返回-1上的錯誤,然後必須被隱式轉換爲一個FILE *

1

正如其他人所說的,無論如何你都要返回一個指針,因爲你的函數被聲明返回一個FILE *。因此,如果fopen()失敗,則應該返回NULL,如果不是,則返回值爲fopen()

但是,你的功能是(幾乎)相當於fopen()!換句話說,你可以取代你的函數:

FILE* my_open_file(char* filename) 
{ 
    FILE *fp = fopen(filename); 
    if (fp == NULL) { 
     fprintf(stderr, "Unable to open file %s", filename); 
     perror(NULL); 
    } 
    return fp; 
} 

fopen()不能保證設置errno,所以我增加了一個fprintf()電話與除perror()調用的文件名。另外,最好在錯誤信息中打印關於無法打開文件的文件名。