#defineの再定義

[戻る]
T 2005/01/12(水) 18:52:24
はじめに
#define MAG 4
と定義して、プログラム中で再定義することはできないのでしょうか?
OnPaint()という関数の中でMAGを使用しています。
しかし、二つ目の case の中で MAG を 8 に変えたいと思っています。
これは不可能なのでしょうか?

---以下がその部分です。---
#define MAG 4

(中略)

    case IDM_CAPTURE:
      OnPaint(hwnd);
      break;
    case IDM_CAPTURE2:
#define MAG 8
        OnPaint(hwnd);
      break;

ぷりぷろせっさ 2005/01/12(水) 19:06:53
#undef

tib 2005/01/12(水) 19:58:27
#define MAG 4

(中略)

    case IDM_CAPTURE:
      OnPaint(hwnd);
      break;
    case IDM_CAPTURE2:
#undef MAG
#define MAG 8
        OnPaint(hwnd);
      break;

これで再定義はできますが、defineはあくまでプリプロセッサ用のものであるという事を
お忘れなく。IDM_CAPTUREの時にはMAG==4で、IDM_CAPTURE2の時にはMAG==8でOnPaint()が
呼ばれる、という事にはならないので、ご注意下さい。

なんか、例示されたソースが怪しく見えたので...。
もしそういうつもりでないのでしたら読み飛ばしてください。

tib 2005/01/12(水) 20:06:39
OnPaint()の中身を修正できるのなら、
・「int m_nMAG」をメンバ変数に追加。
・OnPaint()を呼ぶ前にm_nMAGの値を設定。
・OnPaint()内でMAGを使っている所をm_nMAGを使うよう修正。
・OnPaint()以外でMAGを使っている所がないか、m_nMAGを使うよう修正
 した事による影響が別の所に出ないかチェック。

と、私だったらすると思います。

RAPT 2005/01/13(木) 01:30:51
もしくは、enumで定数として宣言するとか。

PATIO 2005/01/13(木) 11:04:48
tibさんの意見に賛成。
途中で切り替えるような物は多分定数とは言えないと思うので、
#defineで定数定義する事がそもそも間違っていると思います。

T 2005/01/13(木) 11:49:05
tibさん、みなさん
御解答どうもありがとうございます。

#define は途中で変更するものではないのですね。
知識足らずなもので、御迷惑おかけいたしました。

さて、OnPaint()の中で
int m_nMAG;
と定義して、case の中で
int m_nMAG = 4;
というふうにアドバイス通りに変更してみたのですが
ビルドすると、int m_nMAG = 4; を入れた箇所で

"構文エラー : ';' が 'type' の前に必要です。"

というエラーが出てしまいます。確かに";"はつけているのですが・・・。
何か単純なミスをしているのでしょうか?

不具合 2005/01/13(木) 12:15:36
「メンバ変数」を検索してください。

T 2005/01/15(土) 14:53:45
MSDNのメンバ変数の追加というのを参考にメンバ変数を追加しようとしたのですが、
書いてあるようにはいきませんでした。
クラスビューのところで、右クリックしても「追加」というメニューはでてきませんでし
た。

もともと、クラスとして作成したつもりではないのですが・・・。
関数だと思うのですが、関数だとメンバ変数は使えないですよね?

KING・王 2005/01/17(月) 08:09:18
メンバ変数はクラスに属する(?)もので、
「〜というクラスのメンバ変数」というように使用します。

で、関数のメンバ変数とは言いません。
恐らく関数内のローカル変数のことだと思います。

関数のローカル変数は、VSの右クリックのメニューからは追加できません。
C++などでは、関数内のどの位置に追加するかということも問題になりますので、
VC側から追加はできないと思います。

ご自分で、直接関数のコード内に追加して下さい。

#メンバ変数とローカル変数の違いがわからないようでしたら、
#C++の入門書等で、調べて下さい。

RAPT 2005/01/17(月) 11:46:37
> ・「int m_nMAG」をメンバ変数に追加。
> ・OnPaint()を呼ぶ前にm_nMAGの値を設定。
> ・OnPaint()内でMAGを使っている所をm_nMAGを使うよう修正。
> ・OnPaint()以外でMAGを使っている所がないか、m_nMAGを使うよう修正
>  した事による影響が別の所に出ないかチェック。

■1点目
これがどうして、下記の内容になるのかが分からない。

> さて、OnPaint()の中で
> int m_nMAG;
> と定義して、case の中で
> int m_nMAG = 4;
> というふうにアドバイス通りに変更してみたのですが


■2点目
クラススコープのメンバ変数をローカルスコープの自動変数として
宣言することも問題だし、switch-case文内で、別の変数を宣言しようと
すること自体がおかしい。

■3点目
そもそも、case節で、変数の宣言はできません。
(case節で新規にブロックを書いた場合を除く)
 ↓
int a;
switch( hoge ){
case foo:
 a = 1:
}
なんてのはできるが、

switch( hoge_ ){
case bar:
 int a = 1:
}
と書くとコンパイルエラーです。

T 2005/01/17(月) 17:38:53
[[解決]]
KING・王さん、RAPTさん
アドバイスありがとうございます。

関数の中で int m_nMAG の値を設定するのではなく
関数の外(プログラムの先頭で初期化し、 case の中で
m_nMAGの値を変更したらうまくいきました。

変数について、もっと勉強していきたいと思います。
御協力してくださいましたみなさん、どうもありがとうございました。

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