首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“strerror”之前的预期初始化器

“strerror”之前的预期初始化器
EN

Stack Overflow用户
提问于 2016-05-29 11:16:55
回答 2查看 1.3K关注 0票数 0

我正在尝试创建一个像这样的函数,它将输出与它的错误号相关的错误细节,但是我得到了错误error: expected initializer before 'strerror'。这是代码

代码语言:javascript
复制
#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;
}

如何解决这个问题?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-29 11:54:56

我只是意识到我给出的答案并没有解决实际的问题。这里的关键问题是,当您使用#include <cstring>时,可以从标准的C标头<string.h>获得所有标识符,这些标识符都是在名称空间std中声明的。此外,可能也会在全局命名空间中获取(可能也会)所有这些名称。因此,当您编写名为strerror的函数时,您将与C函数strerror直接冲突,即使正确地排序了__cdecl内容。因此,要编写您自己的错误报告函数,请给它一个与C标准库中的任何名称不同的名称,而不必费心使用extern "C"__cdecl。这些都是你还不需要的专门工具。

代码语言:javascript
复制
char* error_msg(int erratum) {
    if (errnum < NUM_MESSAGES)
        return messages[errnum];
  return "Unknown error";
}
票数 1
EN

Stack Overflow用户

发布于 2016-05-29 11:24:45

不要自己编写标准库函数的声明。它们通常有编译器和特定于系统的详细信息,需要您编写库的编写人员已经为您完成的一堆条件代码(并且做得更好)。对于strerror来说,#include <string.h>是你所需要的。不过,更好的方法是#include <cstring>,并在调用它时使用std::strerror

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37509217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档