ビルド後のdefine値の取得方法

[戻る]
ebimayo 2006/07/31(月) 09:13:22
いつもお世話になります。ebimayoです。

実現可能かどうかも分からないのですが、以下のようにdefineして

#define TEIGI 100

ビルド後(プログラム実行時)に"TEIGI"という文字列(文字列でなくてもいいのです
が)
から100という値を得ることは可能でしょうか?
また、可能ならその実現方法はどのようにすればいいのでしょうか?


説明が下手かなと思うので、やりたいことの例を書きます。
通常なら

int atai
atai = TEIGI;

と、書くことでataiに100が代入されると思いますが、このTEIGIをプログラムに
埋め込まず、例えばテキストボックスでTEIGIと入力した文字列から
defineした値の100を得る方法があれば知りたいです。


説明が下手で分かりにくい文章かと思いますが宜しくお願いします。



開発環境
Microsoft WindowsXP(SP2)
Microsoft Visual C++ 2005
  ダイアログベースアプリケーション(MFC)

aharen [E-Mail] [HomePage] 2006/07/31(月) 09:34:08
CString str;
str.LoadString(IDS_WEB_TUTORIAL);

ではうまくいきませんでしょうか
ただしIDS_WEB_TUTORIALはもちろん一例

Blue 2006/07/31(月) 09:35:39
おそらく、#defineだけでは無理でしょう。

#defineされた識別子はコンパイル時には、置換が行われているため、
実行時にはもう何が#defineされていたのか、どんな識別子だったのかさえわからないと
思います。

普通は、文字列、値の「マップリスト」と言われるものを利用して値を取り出すことを
します。MFCならばCMap系を使うとか。

aharen [E-Mail] [HomePage] 2006/07/31(月) 09:36:16
すみません質問を勘違いしていました

tetrapod 2006/07/31(月) 10:02:57
こーいう感じで一覧表を作っておくしかないでしょうね。
enum なんかも同じ方法で一覧を作っておく方法を取ります。

struct value_map_t {
  const char* text;
  int value;
};
const struct value_map_t value_map[]={
  {"TEIGI", TEIGI},
  {"FOO", FOO},
  ...
};

{ } の中をマクロで簡略化するともっといい。

ebimayo 2006/07/31(月) 10:06:03
[[解決]]
aharenさん Blueさん 回答ありがとうございます。

やはり無理ですか
CMapクラスなるものは初めて知りました。

現在は文字列と値をペアで保持して取り出す仕組みを作っていますが、
今やりたかった事がBitmapなどをリソースとして追加したときの
define値を、設定ファイルから読み込んだ文字列を元に検索して
define値を取得し、リソースを使用したいと考えていました。

このプログラムが自分の手元から離れて別の人が管理する
(誰か決まってなくいつ決まるかも分からない)状況で、リソース(Bitmap部品)
の入れ替えや追加が必要なときに、一番見落としやすい(忘れやすい)と思った
define値と設定ファイルの結びつける箇所への追加を省略できるように
出来ればいいなと思い質問しました。


出来ないとわかったので解決とさせていただきます。

ebimayo 2006/07/31(月) 10:08:41
あっと書いてる間にもレスが

tetrapodさんありがとうございます。

一覧のようなものを作っていたのですが、上の私の書き込みの通りで
プログラム内の修正が発生した際の追加&修正忘れを未然に防ぎたいための
目的で必要でした。

質問時にここまで書いとくほうがよかったですね。すいません。

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