【问题标题】:Expected initializer before 'strerror''strerror' 之前的预期初始化程序
【发布时间】:2016-05-29 11:16:55
【问题描述】:

我正在尝试创建一个类似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;
}

如何解决这个问题?谢谢

【问题讨论】:

  • std::strerror 无法解决问题@Galik
  • 您已经复制了特定于 Windows 的代码。删除__cdecl
  • 感谢@molbdnilo,将此作为答案发布,我会接受它
  • @molbdnilo,也请详细说明。 :)

标签: c++ linux strerror


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    char* error_msg(int erratum) {
        if (errnum < NUM_MESSAGES)
            return messages[errnum];
      return "Unknown error";
    }
    

    【讨论】:

    • 是的,我更改了函数名称,它工作正常 :) 谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多