デバッグのときには#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;
}