在' strerror'之前的预期初始化程序

时间:2016-05-29 11:16:55

标签: c++ linux 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;
}

如何解决这个问题?感谢

2 个答案:

答案 0 :(得分:2)

不要编写自己的标准库函数声明。它们通常具有编译器和系统特定的细节,这些细节需要您编写一组条件代码,库的编写者已经为您完成了(并且做得更好)。对于strerror#include <string.h>就是您所需要的。但更好的是#include <cstring>,并在调用时使用std::strerror

答案 1 :(得分:1)

我刚才意识到我给出的答案并没有解决实际问题。这里的关键问题是,当您#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";
}