我正在实现与我正在使用的 API 等效的 perror()

perror() ISO C std doc 说:



但以编程方式,这意味着什么?

我目前正在使用 fprintf(stderr, .. )。使用它是错误的吗?如果是真的,为什么?如果我的实现中有一些错误(见下文),请给我点数。

根据我的解释查看我的 C 代码:

void
fooapi_perror(const char *s)
{
  char *emsg;

  if(s != NULL && *s != '\0')
    fprintf(stderr, "%s: ", s);

  emsg = fooapi_strerror(GetLastErrorCode());
  fprintf(stderr, "%s\n",  emsg);
  free(emsg);
}

最佳答案

每个 C 流都有一个属性——“方向”,要么是“面向宽的”,要么是“面向字节的”,这由对这个流的第一个操作决定。当流没有“方向”时,您可以改变流的方向。调用方向与流方向冲突的任何函数都会导致未定义的行为。

例如, printf 将使 Steam 成为面向字节的,而 wprintf 使 Steam 成为面向宽的。

就您的问题而言, perror 不应改变其流的方向。

所以在你的代码中,如果 perror 使用的流已经有一个方向,你应该确保你没有调用一个方向与流的当前方向冲突的函数。

关于c - 实现 perror() - 问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11484950/

10-12 15:04