defineでの機能の切り替えをiniファイルでしたい

[戻る]
roccy 2002/09/02(月) 17:33:09
こんにちは
今、defineで定義するかしないかで
#ifdefで機能の切り替えをしています。これだと、
機能を切り替えるたびにコンパイルしなければなりません。
ソースの中には、たくさん#ifdefがあります。
これをiniファイルなどから読み取って動的に機能の
切り替えをしたいと考えています。

・iniファイルから読み取るのは、trueかfalseだけです。
・ソースの中には、
#ifdef __FUNC_EX1__
   // (追加機能)
#endif
がたくさんちりばめられています。
・ヘッダーファイルで__FUNC_EX1__を定義しています。
 これにより機能のあり・なしを実現しています。
・動作環境は、VC++6.0、MFC、Windows2000です。

どなたかご参考になる意見がありましたら、
お教え願いたいです。よろしくお願いします。

PATIO 2002/09/02(月) 17:48:01
#ifdefがプリプロセッサと呼ばれていることから機能は想像できると思いますが、
#ifdefを使っている限り、リコンパイル以外の方法を使うことは出来ません。
#ifdefを全てifによるフロー制御に置き換えてif文で判断するためのフラグを
iniファイルから取り込むというのであれば話は別ですけれど。

質問内容からでは、#ifdefをそのままにして切り替えたいという風に読めたので
こう書いています。
if文に置き換えることを前提に質問されているのであれば、はっきりそう書かれたほうが
良いと思いますよ。

PAI 2002/09/02(月) 18:37:12
perlを使ってifdefをifに変える、とか?

roccy 2002/09/05(木) 02:07:51
ありがとうございます。
やっぱり、if文に置き換えるしかないのでしょうか?
PATIOの言う通りiniファイルから取り込む方法しかないようですね。
#ifdef __FUNC_EX1__
は、
if( __FUNC_EX1__ ){
で置き換えて、
iniファイルから__FUNC_EX1__の値を読み込む。
のがベストな方法ということですね。

―>PAIさん
>perlを使ってifdefをifに変える、とか?
perlをまったく知らなくても、これは
簡単にできちゃいますか?

PATIO 2002/09/05(木) 09:45:25
PAIさんのperlで置き換えてはと言う話にしても
ifで行うということを前提にしていますよね。

置き換えるしかないということをすんなり理解できないというのは、
プリプロセッサがコンパイル時のどの段階で処理されているかを
きちんと理解していないということになります。
ふーん、出来ないのかで終わってしまっては、何の知識も得られないままになってしまいます。

プリプロセッサについてきちんと調べて理解するようにした方が良いです。
そうすれば、即座に判断できることなので。
どうしてもわからなければ、また質問して下さい。

あと、正規表現を使って複数のファイルの内容を書き換えるようなソフトが
フリーソフトであったと記憶しています。
そういったソフトを使えば、perlで組む必要は無いです。

roccy 2002/09/10(火) 01:54:47
うーむ。やはりどうにもならんようですね。
if文の切り替えだとどうしてもソースがでかくなりますよね。
機能の切り替えをするときは、
iniファイルから読み込みで動的に切り替えたり、
#defineで定義するかしないかで切り替えたり、
それ以外のいい方法はないのでしょうか。
機能があるdllですれば、ソースがでかくならずに
できると思ったのですが、、、
どうでしょう?

PAI 2002/09/10(火) 10:46:43
ソース、というのはソースコードのことですか?
ならばどちらかというとifdefのほうが大きいですよね。

オブジェクトファイル、あるいは実行ファイルのことであれば、
条件をconstにしてサイズ優先の最適化をすれば
ほぼifdefと同じになると思いますが?

関数に切り出して(あるいはstrategyパターンにして)Dll化する
のが確かに最適ですが、(既存の)ソースコードに対しての作業はどうしても
多くなってしまいますよね。

PATIO 2002/09/11(水) 09:28:00
おそらく、#ifdef ????? の行をif(?????){に
#endifを}に置き換えるだけなのでバイト数的には大して変わらないのでは?
ソースってプログラムのソースファイルのことを言ってるわけではないのでしょうか?

プリプロセッサは、コンパイルのコード生成前に機能してソースの内容を
変えてしまうものです。従ってプリプロセッサを使って切り替えようというのに
リビルド無しで切り替えようという発想自体に無理があります。
これについては、C/C++では常識の範囲なので、本当は自分で調べて発言して
ほしかったんですけれど。

あと、ソースといっていますが、もしかして実行ファイルのサイズのことを
言っていたりしませんよね。
通常は実行ファイルのことをソースファイルとは言わないと思いますけれど。
ロードモジュールということはありますけれどね。

新しい機能を追加するのであれば、ソースファイルにしても実行ファイルにしても
大きくなるのはあたりまえなのでこれを気にしていてもしょうがないと思いますよ。
もっとも、プログラムコードに問題があって必要以上にサイズが肥大化するのは
別問題ですけれどね。

roccy 2002/09/25(水) 01:04:30
[[解決]]
ありがとうございます。表現は正しく伝えなければなりませんね。
dllで切り替えるのがモジュールを大きくせずに済むようですね。
皆さん、わかりにくい質問でごめんなさい。
解決です。

古いスレッドには追加発言できません。