マクロとの競合について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dom

マクロとの競合について

#1

投稿記事 by dom » 13年前

maxがwindowsにより定義されている場合、numeric_limitsのmaxなどはコンパイルエラーになりますが、
カッコでくくることにより回避できます。

コード:

#define max ...... //
// 略

{
    std::numeric_limits<Type>::max(); // コンパイルエラー
    (std::numeric_limits<Type>::max)(); // 問題なし
}
同様に、自作クラスのメンバ関数に対してこのようにエラーを回避しようとしましたがうまくいきませんでした。

コード:

class Camera {
public:
    float near();
};

#define near ...... // windef.h
// 略

{
    Camera camera;
    camera.near(); // コンパイルエラー
    (camera.near)(); // コンパイルエラー
}
前者がOKで後者がエラーとなるのはなぜなのでしょうか?
また、対策として、undefする、関数名を変える以外に何かありますでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: マクロとの競合について

#2

投稿記事 by h2so5 » 13年前

maxは関数マクロですが、
(std::numeric_limits<Type>::max)();
はmaxの直後に()がないので関数マクロとして認識されないのでしょう。

nearは関数マクロではないので、()なしでもマクロと認識されてしまいエラーになります。

min, max については #define NO_MIN_MAX を使うことで無効にできます。

閉鎖

“C言語何でも質問掲示板” へ戻る