2016-05-29 53 views
0

我正在嘗試編寫一個函數,如this,它將打印出與錯誤編號相關的錯誤詳細信息,但出現錯誤error: expected initializer before 'strerror'。這裏是代碼'strerror'之前的預期初始值設定

#include <iostream> 
#include <cstring> 

static char* messages[] = { 
    "No error", 
    "EPERM (Operation not permitted)", 
    "ENOENT (No such file or directory)", 
    "ESRCH (No such process)", 
}; 
static const int NUM_MESSAGES = sizeof(messages)/sizeof(messages[0]); 

extern "C" char * __cdecl strerror(int errnum) 
{ 
    if (errnum < NUM_MESSAGES) 
    return messages[errnum]; 
    return "Unknown error"; 
} 

int main() 
{ 
    int a; 
    for(a=0;a<5;a++) 
    { 
     std::cout<<a<<" "<<strerror(a)<<"\n"; 
    } 
    return 0; 
} 

如何解決這個問題?謝謝

+0

'std :: strerror'不能解決問題@Galik – udit043

+2

您已經複製了Windows特定的代碼。刪除'__cdecl'。 – molbdnilo

+0

感謝@molbdnilo,發佈這個答案,我會接受它 – udit043

回答

1

我剛剛意識到我給出的答案沒有解決實際問題。這裏的關鍵問題是,當您#include <cstring>時,您將獲得標準C標頭<string.h>中的所有標識符,在名稱空間std中聲明。另外,你也可以使用(也可能)在全局命名空間中獲得所有這些名稱。所以當你編寫自己的函數strerror時,你會直接與C函數strerror,發生衝突,即使你正確地理清了__cdecl的東西。因此,要編寫自己的錯誤報告功能,請給它一個與C標準庫中的任何名稱不同的名稱,並且不要打擾extern "C"__cdecl。這些都是您不需要的專用工具。

char* error_msg(int erratum) { 
    if (errnum < NUM_MESSAGES) 
     return messages[errnum]; 
    return "Unknown error"; 
} 
+0

是的,我改變了函數名稱,它工作正常:)謝謝 – udit043

2

不要編寫自己的標準庫函數聲明。他們通常會有編譯器和系統特定的細節,這將需要你編寫一大堆條件代碼,庫的作者已經爲你做了(並且做得更好)。對於strerror,#include <string.h>是你所需要的。但是,更好的是#include <cstring>,並且在調用它時使用std::strerror

+0

好的,謝謝。我會記得下次:) – udit043

相關問題