プリプロセッサの使い方とは?

このQ&Aのポイント
  • プリプロセッサを使って、ソースコード内で特定の部分を条件付きで実行できるようにする方法について説明します。
  • #defineディレクティブを使用して、DEBUGPOINTなどのマクロを定義し、その値に応じて実行するコードを選択します。
  • 条件付きコンパイルを行いたい場所で#ifディレクティブを使用して、特定の条件にマッチした場合に実行されるコードを指定します。
回答を見る
  • ベストアンサー

プリプロセッサ

ソースの先頭で #define DEBUGPOINT 1 や #define DEBUGPOINT 5 などを記述して、 #if(DEBUGPOINT==1) debugprint(hWnd, buffer, count); #endif ... #if(DEBUGPOINT==3) debugprint(hWnd, buffer, count); #endif ... #if(DEBUGPOINT==5) debugprint(hWnd, buffer, count); #endif のようなソースで、好きな部分で1回だけdebugprint()を実行できるようにしたいです。 #define DEBUGPOINTの値を変更するだけでいいようにしたいのですが、上に書いたdefineの使い方で間違っている部分はありませんか?

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

まちがいありません。 #define DEBUGPOINT 5 とした場合は、 #if(DEBUGPOINT==5) debugprint(hWnd, buffer, count); #endif のみが、有効となります。 上記の例だと、実行したいステップは、 DEBUGPOINTの1つの値に1つしか対応しませんが 以下のようにすると、複数の文が対応できます。 #define DEBUGPOINT 0x00000009 と定義し #if (DEBUGPOINT & 0x00000001) //0x0001のビットがONなら実行(対象になる) #endif #if (DEBUGPOINT & 0x00000002) //0x0002のビットがONなら実行(対象外になる) #endif #if (DEBUGPOINT & 0x00000004) //0x0004のビットがONなら実行(対象外になる) #endif #if (DEBUGPOINT & 0x00000008) //0x0008のビットがONなら実行(対象になる) #endif もし、すべての箇所を実行させたい場合は、 #define DEBUGPOINT 0xffffffff とします。 最大32は必要ないなら、16ビットで #define DEBUGPOINT 0x0009のように定義しても かまいません。

mrwuce
質問者

お礼

ありがとうございます。

関連するQ&A

  • [C/C++]プリプロセッサのファイル読み込み

    #defineで定数を設定する場合に、TXTなどのファイルを読み込み、読み込んだ 値を定数として設定することは可能でしょうか? 下記のようなプログラムを考えていたのですが、うまくいかなくて悩んでいます。 ご教授お願いします。 #define VARIABLE '0' #define TMP fgetc(fopen("./test.txt","r+")) #undef VARIABLE #if TMP=='a'   #define VARIABLE 'a' #elif TMP=='b'   #define VARIABLE 'b' #else   #define VARIABLE 'c' #endif

  • if ((式 )のアドバイス

    いつもこの投稿欄でお世話いただいております。 今C言語の勉強中なのですが、Cの知識が乏しい為、 簡単なところで、理解に苦しんでしまいます。 今回質問の下記ソースコードは、あるサンプルプログラムの 抜粋部分になります。 =================================================== count++; | 省略   | while(1) { if(count >=100) { count = 0; data++; if(data > 9) data = 0; output(LED[data]); } } ========================================= 以上while(1)部分の解釈になりますが、 1.もし、countの値が100より小さい場合は if(count>=100)式が成り立たないので それ以降の{}内の処理を実行せず、ループを ぬける。 2.もし、countの値が100になった場合は   if(count>=100)式が成立するので,以降   {}の中の処理、countに0を代入、    data変数を1つインクリメントし、次のコードへ、    if(data>9)もし,dataの値が9より小さい場合は    data = 0 output(LED[data])   は実行しない。 3.とすれば、data++した値が、10にならないと   data =0,とoutput(LED[data])は実行されない。 と解釈しているのですが、実験回路で試験すると サンプルコードからは、countが100になる毎に output(LED[data])が毎回実行されている様に なっています。 もう少し、ソースコードの説明すると、 if(count>=100)が成立するには1秒の時間がかかります。 そして、if(count>=100)式が10回(10秒)成立すれば if(data>9)のdata値も10になり成立するので output(LED[data])が10秒後に1回実行されると考えて、 しまいますが、実際では、1秒毎に[LED]表示が繰返されてます。 もちろん、その結果では正しいのですが、自分の理解とは違っています。 これまでの解釈の何処に問題があるのでしょうか? 単純な質問になりますが、アドバイスどうか宜しくお願いいたします。

  • プリプロセッサ#ifdef~#endifについて

    C言語のプリプロセッサ#ifdef~#endifを使用して以下のソースファイルを作成しました。コンパイルするとエラーになります。 (pre.c)*********************** /* 各行の頭は行番号を表しています。*/ /* 実際のソースには記述していません。 */ 1: #include <stdio.h> 2: 3: #define TAB 0x61 4: #ifdef TAB 5: printf("%c", TAB); 6: #endif 7: 8: int main(void) { 9: return 0; 10: } ****************************** C:\>cl pre.c Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. pre.c pre.c(5) : error C2143: 構文エラー : ')' が '文字列' の前にありません。 pre.c(5) : error C2143: 構文エラー : '{' が '文字列' の前にありません。 pre.c(5) : error C2059: 構文エラー : '<不明>' pre.c(5) : error C2059: 構文エラー : ')' 原因について、どなたか教えて頂けませんでしょうか?

  • 数値が 2 のべき乗かどうか調べるマクロ

    define した値や変数値が、2 のべき乗かどうかを 関数ではなくマクロで簡単に評価できる方法はありますか。 例) #define BUFFERSIZE (2048) // OK //#define BUFFERSIZE (2000) // NG #if !(BUFFERSIZE が 2 のべき乗か調べるマクロ/評価式) # error コンパイルエラーメッセージ #endif assert(BUFFERSIZE が 2 のべき乗か調べるマクロ/評価式); buffer[idx] = data; if (BUFFERSIZE が 2 のべき乗か調べる) idx = ++idx & (BUFFERSIZE - 1); else { idx = ++idx % BUFFERSIZE; // idx = (idx + 1) >= BUFFERSIZE ? 0 : (idx + 1); } 上記の、日本語で書いてる部分を満たすマクロ (関数ではなく) は どういうふうにすればいいでしょうか。 よろしくお願いします。

  • boolean型ではなくて

    booleanの2つの値を取る変数ではなく、3つの値を取れる変数ってあるのでしょうか?booleanを2つ使用した場合もやってみたのですがうまく動きませんでした。先に次のようにbooleanを記述して。 boolean state=true; boolean state1=true; boolean state2=true; 後半部分で次のようにやってみたのですが、3値とったことにはならないですかね?(^^; if(state)     {      if(state1){buffer=img2;}      else{buffer=img3;}      if(state2){buffer=img4;} else{buffer=img5;}     } else{} g.drawImage(buffer,0,0,null); state1 = !state1; state2 = !state2;

    • ベストアンサー
    • Java
  • #if

    #if defined(DECRYPTION_KEY_SCHEDULE) #if DEC_ROUND == NO_TABLES #define ff(x) (x) #else #define ff(x) inv_mcol(x) #ifdef dec_imvars #define d_vars dec_imvars #endif #endif 上の部分をコンパイルすると、 'ff'マクロが再定義されました というエラーメッセージが出るのですが、 なぜ再定義になるのか分かりません。  OS:Win2000 コンパイラ VC++ 6.0 以前は、同じようなエラーが出て、 #else を使わないで全て書き直しました。  よろしくお願いいたします。

  • #ifdef _DEBUGが効かない

    こんにちは。 Win2000、VC++6.0使用。 今までC言語でプログラムを組んではいましたが、 #define _DEBUG #ifdef _DEBUG print(...); #endif というようにデバッグ用のコードを入れたことはありませんでした。 このような便利なものがあると知り、早速使ってみたのですが、 #define _DEBUG の一文をコメントアウトして、再コンパイル(リビルド) して実行してみたのですが、 普通に #ifdef _DEBUG #endif で囲まれた部分が実行されてしまいます。 #define _DEBUG を宣言しなければ、実行されないと思っていたのですが 自分の勘違いでしょうか? よくわかりません。 どなたかご存知の方、よろしくお願いします。

  • Cで書かれたコードの文字マクロ部分がわかりません。

    下記に示す、Cのサンプルプログラムの文字マクロの部分がわからず、困っています。 ソースの実行環境の違いを吸収するための部分であることはわかるのですが、どうしてこのようにて定義されたのかがわかりません。 特に、 ●__MINGW32__とは何か? ●#if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__)のところで、なぜ||と&&を併用しているのか。&& !defined(__MINGW32__)がどうして必要なのか? ●C##UI64、C##UL、C##ULLはそれぞれ何なのか? ●__arch64__は何か?なぜ必要なのか? ●なぜ、下のソース(文字マクロ部分)のdefineの流れになったのか? のあたりがわかりません。よろしくお願いします。 ---------------------------------------------------------------------- #if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__) typedef unsigned __int64 u64; #define U64(C) C##UI64 #elif defined(__arch64__) typedef unsigned long u64; #define U64(C) C##UL #else typedef unsigned long long u64; #define U64(C) C##ULL #endif ----------------------------------------------------------------------

  • c言語で文書を読み込み、単語の出現頻度を教える

    c言語の課題で、与えられた文書を読み込んでその中にある単語の出現頻度を教えるプログラミングを作成しているのですが、うまくいきません。 どこが間違っているのでしょうか?? ファイルの中身は As sweet as coat , green , milk And everyone think coat になっており、求めたい回答は buffer[0]=As count=1 buffer[1]=sweet count=1 buffer[2]=as count=1 buffer[3]=coat count=2 buffer[4]=green count=1 buffer[5]=milk count=1 buffer[6]=And count=1 buffer[7]=everyone count=1 buffer[8]=think count=1 Number of words:9 にしたいのです。 プログラミングは #include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> typedef struct token_checker{ char * token; int count; }TOKEN_CHECKER; int main(int argc,char* argv[]){ FILE * fp; char buffer[1024]; int numword=0; char * delimiter = " .,"; char * s; TOKEN_CHECKER *t; int j; int i = 0; int flag =0; int find = -1; t=(TOKEN_CHECKER*)malloc(sizeof(TOKEN_CHECKER)*24); if(argc != 2){ printf("Parameter error.\n"); exit(1); } if((fp=fopen(argv[1],"r"))==NULL){ printf("File open error.\n"); exit(1); } while( fgets(buffer,sizeof(buffer),fp)!=NULL){ buffer[ strlen(buffer)-1]='\0'; s = strtok(buffer,delimiter); if(s != NULL){ t[numword].token=s; for(i=0;i<=numword;i++){ if(strcmp(t[numword].token,t[i].token)==0){ t[i].count++ } } printf("buffer[%d]=%s count=%d\n",numword,t[numword].token,t[numword].count); numword++; } while((s=strtok(NULL,delimiter)) != NULL){ t[numword].token=s; for(i=0;i<=numword;i++){ t[numword].count=0; if(strcmp(t[numword].token,t[i].token)==0){ t[i].count++; } } printf("buffer[%d]=%s count=%d\n",numword,t[numword].token,t[numword].count); numword++; } } printf("Number of words:%d\n",numword); free(t); fclose(fp); exit(0); } になっており、実行すると buffer[0]=As count=1 buffer[1]=sweet count=1 buffer[2]=as count=1 buffer[3]=coat count=1 buffer[4]=green count=1 buffer[5]=milk count=1 buffer[6]=And count=1 buffer[7]=everyone count=1 buffer[8]=think count=1 buffer[9]=coat count=1 Number of words:9 となってしまい、coatがカウントされないのです。

  • Maximum mount count の値が?

    (チェック)回目のmount時に自動で fsck を実行する・・・という設定の記述を見るのに以下を実行すると、 Maximum mount count: の値がマイナスになっていました。 # tune2fs -l /dev/sda1 | grep -i "mount count" Mount count: 31 Maximum mount count: -1 普通、例えば Mount count: 31 Maximum mount count: 60 だと、これまでに31回 mountしていて、いざ60回 mountしたあかつきには 自動で fsckが実行されるんだと思いますが、Maximum mount countの値が マイナスとは、どういう意味になるでしょうか。 どなたかご存じの方ぜひご教授ください。

専門家に質問してみよう