45

2 つの異なるメソッドへの呼び出しが 2 つあります。

void func1() 
{
  // do something 
  if (fail) 
  {
    // then set errno to EEXIST

  }

}

そして2番目の方法:

void func2() 
{
  // do something 
  if (fail) 
  {
    // then set errno to ENOENT

  }

}
  1. を何らかの値に設定するerrnoと、どうなりますか? エラーチェックだけですか?

  2. errno上記のメソッドfunc1func2toEEXISTおよびto でどのように設定できますかENOENT

ありがとう

4

3 に答える 3

73

errnoすべての実用的な目的のために、グローバル変数のように扱うことができます (ただし、通常はそうではありません)。したがって、それを含めerrno.hて使用してください:

errno = ENOENT;

errnoが目的に最適なエラー報告メカニズムであるかどうかを自問する必要があります。エラーコード自体を返すように関数を設計できますか?

于 2012-07-28T08:55:18.300 に答える
12

errnoシステムレベル向けに設計された規格、IMO 。私の経験では、それらを汚染しないでください。C 標準メカニズムをシミュレートする場合はerrno、次のような定義を行うことができます。

/* your_errno.c */
__thread int g_your_error_code;

/* your_errno.h */
extern __thread int g_your_error_code
#define set_your_errno(err) (g_your_error_code = (err))
#define your_errno (g_your_error_code)

また、まだ実装できますyour_perror(err_code)詳細については、 glibcの実装を参照してください。

于 2013-01-20T03:57:05.853 に答える
4
#include <errno.h>
void func1() 
{
  // do something 
  if (fail) 
  {
    errno = ENOENT;
  }
}
于 2012-07-28T08:55:51.303 に答える