'strerror' 之前的预期初始化程序
Expected initializer before 'strerror'
我正在尝试创建一个类似于 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;
}
如何解决这个问题?谢谢
不要编写自己的标准库函数声明。他们通常会有特定于编译器和系统的详细信息,这些详细信息将要求您编写库的作者已经为您完成的一堆条件代码(并且做得更好)。对于 strerror
,#include <string.h>
就是您所需要的。不过,更好的方法是 #include <cstring>
,并在调用时使用 std::strerror
。
我刚刚意识到我给出的答案并没有解决实际问题。这里的关键问题是,当您 #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";
}
我正在尝试创建一个类似于 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;
}
如何解决这个问题?谢谢
不要编写自己的标准库函数声明。他们通常会有特定于编译器和系统的详细信息,这些详细信息将要求您编写库的作者已经为您完成的一堆条件代码(并且做得更好)。对于 strerror
,#include <string.h>
就是您所需要的。不过,更好的方法是 #include <cstring>
,并在调用时使用 std::strerror
。
我刚刚意识到我给出的答案并没有解决实际问题。这里的关键问题是,当您 #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";
}