2016-05-29 10 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標準ライブラリの名前とは異なる名前を付けてください。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

関連する問題