デバッグのときには#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型を次のように、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); }
#include <stdarg.h> #include <string.h> #include <errno.h>
//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); }
//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; }
//emalloc : mallocで、エラー時にはそれを知らせる void *emalloc(size_t n) { void *p; p = malloc(n); if(p == NULL){ eprintf("malloc of %u bytes failed:",n); } return p; }
static char *name = NULL;//プログラム名 //setprogname : プログラム名を設定 void setprogname(char *str) { name = estrdup(str); } //progname : プログラム名を返す char *progname(void) { return name; }