ページ 11

C++ if文にマクロ

Posted: 2017年10月16日(月) 10:11
by マクロ初めて
本を読みながらゲームを制作中なのですが、マクロを使うところが出てきて詰まっています。

コード:

#define RECTANGLE_WIDTH(r) ((r).right-(r).left); //RECTの高さを計算
というものがあって、

コード:

if (RECTANGLE_WIDTH(*rectangle) < (MIN_ROOM_SIZE + 3) * 2 + 1)  {
    //処理
}
という風に書きたいのですが、RECTANGLE_WHIDTHのところでエラーをはいてしまいます。
エラー内容は「')'が必要です」となっています。

他に

コード:

int b = RECTANGLE_WIDTH(*rectangle) - MIN_ROOM_SIZE - 4; //MIN_ROO_SIZEは定数
という処理も書いているのですが、こちらはちゃんと動いています。
なので、if文での使い方が間違っているのかなと考えました。

定数の中身は動いている処理がある以上関係ないと考え詳細は省いていますが、必要な場合はお手数ですが指示を下さい。詳細を追記します。

また、参考にしている本が古いものなので、もっといい書き方などございましたら、そちらもお願いしたく思います。

どうぞよろしくお願いします。

Re: C++ if文にマクロ

Posted: 2017年10月16日(月) 10:28
by maru
マクロの最後のセミコロン(;)が余分。

Re: C++ if文にマクロ

Posted: 2017年10月16日(月) 11:14
by マクロ初めて
ありがとうございました。
普通に行けましたorz

知ってないと癖でつけてしまいまいますし、気付けないものですね…

Re: C++ if文にマクロ

Posted: 2017年10月16日(月) 11:22
by maru
一応書いておくと

コード:

int b = RECTANGLE_WIDTH(*rectangle) - MIN_ROOM_SIZE - 4; //MIN_ROO_SIZEは定数
は、コンパイルエラーになっていないだけで、意図したとおりには動作していないはずです。

マクロを展開すると、

コード:

int b = ((*rectangle).right-(*rectangle).left);  - MIN_ROOM_SIZE - 4; //MIN_ROO_SIZEは定数
となるわけで、b には *rectangle の幅が入ります。後ろの - MIN_ROOM_SIZE - 4; は効果のない文となります。
エラーではないけど、警告が出ているのではないでしょうか?
マクロ初めて さんが書きました:もっといい書き方などございましたら、そちらもお願いしたく思います。
とのことなので、アドバイスを差し上げると、マクロを使用せず、インライン関数にした方がよいでしょう。

コード:

inline int RECTANGLE_WIDTH(RECT r)  { return r.right - r.left; }