'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";
}