defineでの機能の切り替えをiniファイルでしたい – プログラミング – Home

defineでの機能の切り替えをini...
 
通知
すべてクリア

[解決済] defineでの機能の切り替えをiniファイルでしたい


roccy
 roccy
(@roccy)
ゲスト
結合: 23年前
投稿: 82
Topic starter  

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

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

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


引用未解決
トピックタグ
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

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

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


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

perlを使ってifdefをifに変える、とか?


返信引用
roccy
 roccy
(@roccy)
ゲスト
結合: 23年前
投稿: 82
Topic starter  

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

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


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

PAIさんのperlで置き換えてはと言う話にしても
ifで行うということを前提にしていますよね。

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

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

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


返信引用
roccy
 roccy
(@roccy)
ゲスト
結合: 23年前
投稿: 82
Topic starter  

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


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

ソース、というのはソースコードのことですか?
ならばどちらかというとifdefのほうが大きいですよね。

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

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


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

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

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

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

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


返信引用
roccy
 roccy
(@roccy)
ゲスト
結合: 23年前
投稿: 82
Topic starter  

ありがとうございます。表現は正しく伝えなければなりませんね。
dllで切り替えるのがモジュールを大きくせずに済むようですね。
皆さん、わかりにくい質問でごめんなさい。
解決です。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました