我正在尝试创建一个类似this的函数,它会打印出与其相关的错误详细信息,但我收到错误error: expected initializer before '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 :(得分:2)
不要编写自己的标准库函数声明。它们通常具有编译器和系统特定的细节,这些细节需要您编写一组条件代码,库的编写者已经为您完成了(并且做得更好)。对于strerror
,#include <string.h>
就是您所需要的。但更好的是#include <cstring>
,并在调用时使用std::strerror
。
答案 1 :(得分: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";
}