ページ 1 / 1
#defineの扱いについて(Cです)
Posted: 2012年1月06日(金) 21:07
by オリックス
コード:
#define N 5
void main(void)
{
int key = 0;
key = rand()*100/100;
if (key = 99) N=4にしたい。;
else N=5にしたい。;
}
といったCのソースがあります。
このとき、N=5で固定されていますが、プログラム中のある条件の場合はN=4にして、その他の場合は、N=5にする。
といったようなプログラムを書くにはどうしたらよいでしょうか?
よろしくお願い致します。
Re: #defineの扱いについて(Cです)
Posted: 2012年1月06日(金) 21:09
by softya(ソフト屋)
#defineはコンパイル時に確定してしまいますので不可能です。
素直にNを変数にして下さい。
Re: #defineの扱いについて(Cです)
Posted: 2012年1月06日(金) 22:24
by たかぎ
「ある条件」とは何なのかによって、対応方法が変わります。
その条件がコンパイル時に決まるのであれば、大多数の処理系ではマクロ定義をコンパイルオプションで指定できますので...
コード:
#ifndef N
#define N 5
#endif
ソースコード上では上記のようにしておき、たとえば、N=4にしたいのであれば、GCCの場合、-DN=4 オプションをコンパイル時に指定すればOKです。
そうではなく、実行時に値を変更したいのであれば...
コード:
#define N ((int)var_N)
int var_N = 5;
のようにしておけば、条件に応じてvar_Nの値を変更すれば、Nを評価したときの値を変更することができます。
Re: #defineの扱いについて(Cです)
Posted: 2012年1月06日(金) 23:12
by オリックス
たかぎさん、softyaさんありがとうございます。
たかぎさんの書いて下さったコードの
#ifndef N
#define N 5
#endif
これがまさに知りたかったことです。
どのように使えば良いのかよくわかっていないので、
明日取り調べてみます。有難うございました。
Re: #defineの扱いについて(Cです)
Posted: 2012年1月07日(土) 08:03
by beatle
でもオリックスさんが最初に提示されたソースコードは,keyが99のときにNを4にしたくて,それ以外のときにNを5にしたい,と見受けられます(条件式が代入になっているのはミスだと仮定して).
とすると,これは実行時に決定するはずですから,#ifdef / #endifは使えません.
しかし,「これがまさに知りたかったことです。」とありますし,僕の心配は無駄な心配なのでしょうか...
Re: #defineの扱いについて(Cです)
Posted: 2012年1月07日(土) 08:50
by softya(ソフト屋)
コンパイル時確定でよくて、マクロ定義したいだけならVC++の場合であれば「プロパティ→構成プロパティ→C/C++→プリプロセッサ→プリプロセッサの定義」にN=6とかを付け加えるだけです(セパレータは;)。
これが本当にやりたい事なのか私も疑問ですが。
Re: #defineの扱いについて(Cです)
Posted: 2012年1月07日(土) 09:39
by オリックス
softyaさん、すみません、御返信どうもありがとうございます。
よく考えたのですが、実行時にマクロを定義したいということでした。
C++でいうところのconstと同じです。失礼しました。
本当はC++で書きたいのですが、Cで書いてあるソースをC++ファイルとして実行すると
エラーが出てきてしまうため、悪戦苦闘しています。また書き込みさせて下さい。
Re: #defineの扱いについて(Cです)
Posted: 2012年1月07日(土) 09:49
by たかぎ
オリックス さんが書きました:よく考えたのですが、実行時にマクロを定義したいということでした。
それは無理です。評価結果を変更することなら、先に示した方法で可能です。
オリックス さんが書きました:C++でいうところのconstと同じです。失礼しました。
C++のconstも実行時に変更はできません。
自動変数なら都度変更は可能ですが、定数式にならないので、おそらく期待した用途になりませんし、そうした使い方ならCでもできます。
オリックス さんが書きました:本当はC++で書きたいのですが、Cで書いてあるソースをC++ファイルとして実行すると
エラーが出てきてしまうため、悪戦苦闘しています。また書き込みさせて下さい。
普通は小手先の修正で対応可能です。
それができないのなら、おそらく根本的に何かおかしいのではないかと思います。
Re: #defineの扱いについて(Cです)
Posted: 2012年1月07日(土) 09:53
by たかぎ
一応、実行時に強引に書き換える方法も考えてみました。
ひとつは、インタープリタを使う方法です。CINTのようなインタープリタであれば、ソースファイルを書き換えながら実行することも不可能ではないと思います。
もうひとつは、実行時に再コンパイルする方法です。インタープリタと基本的な発想は同じです。