エラー、バグ、質問 - ページ 2864

 
Andrey Khatimlianskii:

では、なぜうまくいかないのでしょうか?

もっとも、このやり方ではどこにも通用しない。右側のVALUEが未定義であるような代入が行われているからです。

#define  VALUE (VALUE*2)
 
fxsaber:

このやり方は、おそらくどこでも通用しないでしょう。右側のVALUEが未定義のまま代入が行われているため。

他人のマクロ置換を変えるのは悪ですしね。これがあらかじめ定義された環境マクロであれば、なおさらです。プロジェクトの すべてのファイルが組み立てられた後、オーバーライドするマクロが最終的にどこになるかは重要ではありません。自分で_VALUEマクロを定義した方が良い。
 
Vladimir Simakov:
そう、そして他人のマクロ置換を変更することは悪なのです。

この悪がなければ、こうは ならなかったのです。

 
Vladimir Simakov:
他人のマクロ置換を変更するのは悪ですし。特に、定義済みの環境マクロであればなおさらです。プロジェクトのすべてのファイルが組み立てられた後、最終的にどこにマクロのオーバーライドが表示されるかは問題ではありません。自分で_VALUEマクロを定義した方がいい。
グローバル変数に VALUEの値を代入し、それを掛け合わせて最終的な定義に代入する方法が使えないのはなぜか、教えてください。
 
Valeriy Yastremskiy:
グローバル変数 にVALUEを代入し、それを掛け合わせて最終的なdefineに代入することができないのはなぜか、お伺いします。

できますが、その場合、マクロ代入の意味がなくなります(コード内の値を代入する)。コンパイラがconst型をc++のconstexpr型に変換してくれることを願うばかりです。

しかし、それ以外は、はい、できます。

#ifdef  MACROS
   const int gValue=2*VALUE;
   #undef  VALUE
   #define  VALUE gValue
#endif
 
Vladimir Simakov:

でも、それなら、はい、できますよ。

それだとうまくいかないんです。

void Func( int = VALUE ) {}
 
fxsaber:

これでは使えません。

もう一度、constexprにお願いして、こんな風に作ってみましょう。
constexpr auto x = 100;

void Foo(int _x = x) {
    std::cout << _x<<std::endl;
}

int main() {
    Foo();
    return 0;
}
 
fxsaber:

このやり方は、おそらくどこでも通用しないでしょう。このような代入が行われているため、右側のVALUEが定義されていないところ。

どうやら、私はコンパイラの仕組みを全く理解していないようです。文字列は順次解析していくイメージです。だから、右側に未定義の値はない。

#define  VALUE 10       // VALUE = 10
#define  TMP VALUE      // TMP = 10
#undef  VALUE           // VALUE = EMPTY
#define  VALUE (TMP*2)  // TMP = 10, следовательно VALUE = 20
 
Andrey Khatimlianskii:

どうやら、私はコンパイラの仕組みを全く理解していないようです。弦楽器は順次解析していくイメージです。だから、右側に未定義の値はない。

テキスト置換のようにトップダウンで動作します。すなわち、"TMP "は "VALUE "に置き換わる。

 
Andrey Khatimlianskii:

どうやら、私はコンパイラの仕組みを全く理解していないようです。弦楽器は順次解析していくイメージです。だから、右側に未定義の値はない。

コンパイラーではなく、プリプロセッサーです)

#define  VALUE (TMP*2)

になる。

#define  VALUE (VALUE*2)

であり、VALUEは未定義である。