• ベストアンサー

正常時のログ出力方法(#ifdef DEBUGLOG使用)

ret = syori(); if(ret != 0){ /* 異常終了(≠0)時 */ printf("error\n"); } という処理があった場合、defineでDEBUGLOGを定義している時は正常終了のメッセージを出すようにしたいと思っています。 そこで質問なのですが、 1.以下のような処理にすると問題があるのでしょうか?「else」の部分があまり好ましいと思えなくて・・・ ret = syori(); if(ret != 0){ /* 異常終了(≠0)時 */ printf("syori() エラー発生\n"); } #ifdef DEBUGLOG else { printf("syori() 正常終了\n"); } #endif 2.1.で記述した方法よりスマートな方法・より良い方法がありましたら教えていただけないでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#15691
noname#15691
回答No.2

----------------------------------------- #define DEBUGLOG #ifdef DEBUGLOG #define DEBUGDISP(x) x #else #define DEBUGDISP(x) #endif ----------------------------------------- ret = syori(); if(ret != 0){ /* 異常終了(≠0)時 */ printf("syori() エラー発生\n"); } DEBUGDISP(else { printf("syori() 正常終了\n"); } ) ----------------------------------------- DEBUGLOGが有効の時だけ、DEBUGDISP内が展開されます。 つまり、こうすれば、いちいち、 #ifdef DEBUGLOG #endif で、括らなくてもよくなります。

doradora55
質問者

お礼

この方法だとすっきりして見えます 回答をありがとうございました

その他の回答 (1)

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

#ifdefは、プリコンパイルで切られるから、別段こだわる必要もあまり無いと思いますが、多分今回のデバッグで違和感があるのは、ifの判定した後に出すからです。 ret = syori(); #ifdef DEBUGLOG printf("syori() ret = [%d]\n", ret); #endif if(ret != 0){ /* 異常終了(≠0)時 */ printf("syori() エラー発生\n"); } とかにすれば、retの値が見えますよ。

doradora55
質問者

お礼

#ifdefの部分を前にもってくるのは考えていませんでした(^^; ありがとうございます

関連するQ&A

  • #ifdef の使い方

    組み込み系のプログラムを現在勉強しています。 #ifdefについて質問させて頂きます。 下記コードの場合 #ifdef A ---- (1) Y = Z; #else -----#if B ------- (2) X = Z; ----#endif #endif ("-"は空白と思ってください。) この場合、Aが定義されていれば(1)が実行しコンパイル終了(#endif)。 Aが定義されていない場合、#else に行き、Bが定義されている場合は (2)を実行してコンパイル終了(#endif)という理解であっていますか? またこうした方が分かりやすいなど、アドバイス頂けると幸いです。 ご返答よろしくお願いします。

  • 数値連続入力プログラムでの配列に格納される文字について

    -------------------------------------------------------- #include<stdio.h> int main(void) {    double sum=0.0;    double dt,x    int ret,n;    char ss[80];    ret=scanf("%lf",&dt);    while(1){       if(ret==1){          x=sum;          sum+=dt;          n=getchar();         if(n=='\n'){            printf("入力された数値=%f\n");            puts("");            sum=sum;         }         else{          printf("正しく入力してください\n");          puts("");          gets(ss);          sum=x;          dt=0.0;         }       }       else if(ret!=0){          gets(ss);          dt=0.0;          printf("正しく入力してください\n");          puts("");       }       else if(ret==EOF){          break;       }       ret=scanf("%lf",&dt);    }       printf("合計=%f\n",sum2);       return 0; } -------------------------------------------------------- 前回、「scanfの入力をgets関数で読み捨てることについて」というタイトルで数値連続加算のプログラムを作り、皆様からいろいろとアドバイスを受けた者です。 いろいろとプログラムを改良し、「Ctrl+Z」の入力でプログラムを終了しようとし、後、前のプログラムでは「10abc」などと打ち込んでも「10」は読み込んでしまうので、「10abc」などと打ち込んだ時点で、エラー表示をさせるようにしました。 ここで疑問なのですが、例えば、 ------- enter enter abc ------- と入力した場合、改行文字が配列ssに格納され、いろいろと複雑になってしまうのかと思ったのですが、ssにはしっかり「abc」だけが格納されていました。 以上のプログラムに不備がないかも含めて、何故そうなるのか教えていただけると嬉しいです。

  • -fopenmpのコンパイルが通らなくなりました。

    とても困っているのでどなたかご存知の方、教えてください。 MACAir OS X 10.8.5を使っています 今まで普通にgccでコンパイルできていたのですが、 急にコンパイルエラーが出るようになりました。 思い当たる節としては、X-codeを新しいバージョン(5.0)にしたことです。 以下のようにOpenmpを実行するためにコンパイルしました。 $gcc -O hello_omp1.c -fopenmp ld: library not found for -lgomp clang: error: linker command failed with exit code 1 (use -v to see invocation) 以下は、hello_omp1.cの中身です。 #include<stdio.h> #ifdef _OPENMP #include<omp.h> #endif int main() { #ifdef _OPENMP printf("procs=%d\n",omp_get_num_procs()); printf("max #threads=%d\n",omp_get_max_threads()); #endif #ifdef _OPENMP #pragma omp parallel { printf("Hello world %d of %d\n", omp_get_thread_num(),omp_get_num_threads()); } #else printf("Helloworld\n"); #endif return 0; }

  • #ifdef多用でソースが見づらい

    #ifdefを多用しているがソースがあり、 非常にソースが見づらいのですが、 適当な#ifdefを指定すると、有効になる箇所のみ 表示してくれるようなツールはありますでしょうか? (無効な箇所がグレー表示になるなどでも結構です) ---------------------------- #ifdef _YUUKOU_ println("YUUKOU"); #else println("MUKOU"); #endif ... #if 0 println("MUKOU"); #else println("YUUKOU"); #endif ----------------------------  ↓↓↓↓↓ ---------------------------- println("YUUKOU"); ... println("YUUKOU"); ---------------------------- よろしくお願いします。

  • 銀行のATMを想定したプログラム

    銀行のATMを想定したプログラム だいたい出来上がったのですが、 error C2143: 構文エラー : ';' が '型' の前にありません。 と出るのですがよくわかりません。 どこが違うのか指摘お願いします。 #include<stdio.h> void gamen();//メニュー画面を表示するユーザ関数をつくる。 int syori(int);//番号を入力した場合の処理はユーザ関数で作り、main関数から呼び出す。 int zandaka; int main(void) { int no,zandaka=100; printf("いらっしゃいませ\n"); do{ gamen(); scanf("%d",&no); int syori(int no); }while(no!=4); return 0; } void gamen() { printf("ご希望のメニューを入力してください\n" "1、お預け入れ\n" "2、残高照会\n" "3、おひきだし\n" "4、終了\n"); } int syori(int no) { int nuwkin,orosu; switch (no){ case 1:printf("お預入れ>"); scanf("%d",&nuwkin); zandaka=zandaka+nuwkin; printf("残高は%d円になります\n\n",zandaka); break; case 2:printf("残高は%d円です\n\n",zandaka); break; case 3:printf("おひきだし額は>"); scanf("%d",&orosu); if(orosu>zandaka){ printf("おひきだし額限度額は%dです" "残高不足なので引き出せません",zandaka); } else { if (zandaka>orosu){ zandaka=zandaka-orosu; printf("残高は%d円になりました",zandaka); } } break; case 4:printf("ありがとうございました\n\n"); break; default:("もう一度ご希望のメニューを入力\n"); } }

  • またまたテストの復習なんですが・・・

    処理内容 基数、および変換対象数値(10進数)を入力させ、それに応じた基数変換を行う。その結果を画面に出力する。 ソースプログラム #include<stdio.h> #define MAX_OUT (16) int InputNum(int, int); char ChangeNum(int); /* メイン処理 */ main(){ int i; /* カウンタ */ int num; /* 対象数値 */ int num_base /* 基数 */ int num_next, num_out; char str[MAX_OUT]; /* 変換後文字格納用 */ while (1){ printf("基数を入力してください(2~32)\n"); printf("(2~32以外の入力で終了)\n"); num_base=InputNum(2,32); if (-1==num_base) { break; } printf("対象の数値を入力してください(0~65535)\n"); printf("(0~65535以外の入力で終了)\n"); num=InputNum(0,65535); if (-1==num) { break; } /* 変換開始 */ ( 1 ) for (i=0; i<MAX_OUT; i++){ /* 変換終了か判定する */ if (num_base>num_next){ /* 変換後文字の格納 */ str[i++]=ChangeNum(num_next); break; } /* 数値文字を抽出 */ num_out=( 2 ) str[i]=ChangeNum(num_out); /* 次の行へ */ num_next=( 3 ) } /* 変換結果を出力 */ printf("対象数値%dの%d進数表現は\n",num, num_base); for (i -= 1; 0<=i; i--) { printf("%c", str[i]); } printf("\nです\n"); } printf("終了します\n"); } /* 数値入力処理 */ int InputNum(int min, int max){ int ret; scanf("%d", &ret); if ((min>ret) || (max<ret)){ ret=-1; } return ret; } /* 数値を文字に変換 */ char ChargeNum(int num){ char ret=0; if (10>num){ ret=num+'0'; } else{ ret=( 4 )+'A'; } return ret; } という問題なんですが、(1)~(4)の答えと説明をどなたかして頂けないでしょうか?どうぞよろしくお願いします!ちなみにwhile(1)は無限ループです。

  • error C2143: 構文エラー : ';' が '{' の前にありません。

    #include <stdio.h> int main(void) {   int in;   printf("20以上の数字を入力してください\n");   scanf("%d", &in);   if(in >= 20){     printf("20以上の数字です。\n");     printf("終了します\n\n");}   else if(in <= 5){     printf("5以下の数字が入力されました\n");     printf("20には程遠いです\n\n");}   else(in <= 19){     printf("20以上の数字ではありません\n");     printf("20以上の数字を入力してください\n\n");}   return 0; } C言語でVisual C++ Expressを使っています このコードでビルドすると (16) : error C2143: 構文エラー : ';' が '{' の前にありません。 と表示されてしまいます。何がいけないのでしょうか?

  • C言語のfork()とpipe()の使用方法についてのサンプルを作成し

    C言語のfork()とpipe()の使用方法についてのサンプルを作成していますが、 期待通りの動作をさせる事ができないため、質問させて頂きます。 現在は、aaa.txtの1行目(てすとだよ。)のみ出力されて2行目が出力されません。 (1)実行方法:a.out aaa.txt (2)期待動作:aaa.txt の内容を出力 <aaa.txt> てすとだよ。 pipeだよ。 <ソース> #include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <stdlib.h> #include <string.h> #define BUFF_SIZE 1024 /* バッファのサイズ1M */ int main(int argc, char **argv) { int pipefd[2]; int p_id; int ret; /* 関数の戻り値 */ int status; FILE *fp; char buff[BUFF_SIZE]; ret = pipe(pipefd) ; /* パイプ生成失敗 */ if(ret == -1) { perror("main"); exit(EXIT_FAILURE); } /* 子プロセス生成 */ p_id = fork(); /* 子プロ生成失敗 */ if(p_id == -1) { perror("main"); exit(EXIT_FAILURE); } if(p_id == 0) { /* 子プロセス側処理 */ printf("子プロ処理開始!!!\n"); /* 使用しないwrite側はクローズ */ close(pipefd[1]); /* パイプから読込む */ while(read(pipefd[0], &buff, BUFF_SIZE) > 0) { fputs(buff, stdout); } close(pipefd[0]); printf("子プロ処理終了!!!\n"); } else { /* 親プロセス側処理 */ printf("親プロ処理開始!!!\n"); /* 使用しないread側はクローズ */ close(pipefd[0]); printf("親プロ:読込ファイル名[%s]\n",*(argv + 1) ); if( (fp = fopen( *(argv + 1), "r" ) ) != NULL) { while(fgets(buff, BUFF_SIZE, fp) != NULL) { printf("パイプに書込む値:%s\n",&buff[0]); /* パイプに書き込む */ write(pipefd[1], buff, strlen(buff) + 1); } fclose(fp); } else { perror("親プロセス "); } close(pipefd[1]); wait(&status); } return EXIT_SUCCESS; }

  • 素数判定の繰返し

    繰返し素数判定を行ない、CtrlーDで終了するプログラムをつくっています。 まず繰返しなしの素数判定プログラムを作り #include<stdio.h> int main(void) { int a,i; printf("自然数を入力:"); scanf("%d",&a); if(a<=0) printf("入力エラーです。\n"); else if(a==1) printf("1は素数ではない。\n"); else{ for(i=2; i*i<=a; i++){ if(a%i==0) break; } if(i*i>a) printf("%dは素数です。\n",a); else printf("%dは素数ではない。\n",a); } return(0); } これはちゃんとできたのですがそれを繰り返すことができません。 #include<stdio.h> int main(void) { int a,i; printf("自然数を入力:"); scanf("%d",&a); while((a=getchar())!=EOF){ if(a<=0) printf("入力エラーです。\n"); else if(a==1) printf("1は素数ではない。\n"); else{ for(i=2; i*i<=a; i++){ if(a%i==0) break; } if(i*i>a) printf("%dは素数です。\n",a); else printf("%dは素数ではない。\n",a); } printf("自然数を入力:"); scanf("%d",&a); } printf("プログラムを終了します。\n"); return(0); } これは訳わからないことになっちゃいます。。。 どうしたらいいんでしょうか??

  • おかしいところ

    ソースのおかしいところ教えてください #include <stdio.h> #include <time.h> #include <stdlib.h> //繰り返し処理(結果のトータル表示なし) main () { int piayer, computer; int limit = 5; //繰り返し回数 int i; printf ("【%d回勝敗ジャンケンゲーム】\n", limit); srand(time(NULL)); for(i = 0; i < limit; i++) { printf("ジャンケンゲーム・・・(グ―:1 チョキ:2 パ―:3を入力) > "); piayer = 0; scanf("%d", &piayer); while (getchar() != '\n') { } computer = rand()%3 + 1; printf("コンピュータは"); if(computer == 1) {printf("グー"); } else if(computer == 2) { printf("チョキ");} else if(computer == 3) { printf("パー");} printf("! "); if(computer == player){ printf("あいこ\n"); } else if(player ==1 && computer ==2){ printf("プレイヤーの勝ち\n"); } else if(player ==2 && computer ==3){ printf("プレイヤーの勝ち\n"); } else if(player ==3 && computer ==1){ printf("プレイヤーの勝ち\n"); } else if(player ==2 && computer ==1){ printf("コンピュターの勝ち\n"); } else if(player ==3 && computer ==2){ printf("コンピュターの勝ち\n"); } else if(player ==1 && computer ==3){ printf("コンピュターの勝ち\n"); } else { printf("プレイヤーが不正な手を出した\n"); } return 0; }

専門家に質問してみよう