我试图创建一个类似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;
}
如何解决这个问题?谢谢
最佳答案
我只是意识到我的回答并不能解决真正的问题。这里的关键问题是,当#include <cstring>
从标准c头<string.h>
获取所有标识符时,这些标识符是在namespacestd
中声明的。此外,您可能(也可能会)在全局命名空间中获得所有这些名称。因此,当您编写自己的名为strerror
的函数时,您将与c函数strerror
发生直接冲突,即使您对__cdecl
的内容进行了正确的排序。因此,要编写自己的错误报告函数,请给它一个与c标准库中的任何名称都不同的名称,而不必为extern "C"
和__cdecl
操心。这些是你还不需要的专门工具。
char* error_msg(int erratum) {
if (errnum < NUM_MESSAGES)
return messages[errnum];
return "Unknown error";
}