我正在尝试创建一个像这这样的函数,它将输出与它的错误号相关的错误细节,但是我得到了错误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;
}如何解决这个问题?谢谢
发布于 2016-05-29 11:54:56
我只是意识到我给出的答案并没有解决实际的问题。这里的关键问题是,当您使用#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";
}发布于 2016-05-29 11:24:45
不要自己编写标准库函数的声明。它们通常有编译器和特定于系统的详细信息,需要您编写库的编写人员已经为您完成的一堆条件代码(并且做得更好)。对于strerror来说,#include <string.h>是你所需要的。不过,更好的方法是#include <cstring>,并在调用它时使用std::strerror。
https://stackoverflow.com/questions/37509217
复制相似问题