我试图创建一个类似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";
}

10-05 23:21