C言語 > Tips

マクロを用いたデバッグ

 デバッグのときには#DEBUGを宣言することで、printfするようにする。 gcc のオプションで -DDEBUG とすると、DEBUG というマクロ変数が定義されるので、これを使っても良い。 例として、以下のマクロを書く。

#ifdef DEBUG
#define DPRINT(s...)  fprintf(stderr, s)
#else
#define DPRINT(s...)  
#endif

表示させる場所では次のように書けばよい

DPRINT("debug message %d\n", i);

enum型とswitch文

enum型を次のように、case(値)の値として使用することができる。

typedef enum {
  BCC,
  FCC,
  HCP
} CrystalStructure;

CrystalStructure eCrystalStructure = xx;

switch (eCrystalStructure) {
 case BCC:          
   GenerateBCC();
   break;
 case FCC:          
   GenerateFCC();
   break;
 case HCP:  
   GenerateHCP();
   break;
 default:
   exit(1);
}

エラーラップ関数の例

ファイルの例 ewrap.h?

  • 使用ヘッダファイル
    #include <stdarg.h>
    #include <string.h>
    #include <errno.h>
  • void eprintf(char *fmt, ...) エラーメッセージを出力する関数
    //eprintf : エラーメッセージを出力する関数
    void eprintf(char *fmt, ...)
    {
      va_list args;
    
      fflush(stdout);
      if(progname() != NULL){
        fprintf(stderr,"%s: ",progname());
      }
    
      va_start(args,fmt);
      vfprintf(stderr,fmt,args);
      va_end(args);
    
      if(fmt[0] != '\0' && fmt[strlen(fmt)-1] == ':'){
        fprintf(stderr,"%s",strerror(errno));
      }
      fprintf(stderr,"\n");
      exit(2);
    }
  • char *estrdup(char *s) 文字列のコピー.エラー時にはそれを知らせる
    //estrdup : 文字列のコピー.エラー時にはそれを知らせる
    char *estrdup(char *s)
    {
      char *t;
    
      t = (char *)malloc(strlen(s) + 1);
      if(t == NULL){
        eprintf("estrdup(\"%.20s\")failed:",s);
      }
      strcpy(t,s);
      return t;
    }
  • void *emalloc(size_t n) mallocし、エラー時にはそれを知らせる
    //emalloc : mallocで、エラー時にはそれを知らせる
    void *emalloc(size_t n)
    {
      void *p;
    
      p = malloc(n);
      if(p == NULL){
        eprintf("malloc of %u bytes failed:",n);
      }
      return p;
    }
  • void setprogname(char *str)
  • char *progname(void) プログラム名の設定と、返す関数
    static char *name = NULL;//プログラム名
    
    //setprogname : プログラム名を設定
    void setprogname(char *str)
    {
      name = estrdup(str);
    }
    
    //progname : プログラム名を返す
    char *progname(void)
    {
      return name;
    }
最終更新:2013年07月15日 17:08