Hatalar, hatalar, sorular - sayfa 2864

 
Andrey Khatimlianskii :

Peki neden çalışmıyor?

Büyük olasılıkla, bu yaklaşım hiçbir yerde çalışmıyor. Çünkü sağdaki VALUE tanımlanmadığında böyle bir değiştirme var.

 #define VALUE (VALUE* 2 )
 
fxsaber :

Büyük olasılıkla, bu yaklaşım hiçbir yerde çalışmıyor. Çünkü sağdaki VALUE tanımlanmadığında böyle bir değiştirme var.

Evet ve başka birinin makro ikamesini değiştirmek kötüdür. Özellikle bunlar önceden tanımlanmış ortam makrolarıysa. Tüm proje dosyalarını oluşturduktan sonra, makro yeniden tanımlamasının sonunda nerede görüneceğini asla bilemezsiniz. _VALUE makronuzu tanımlamak daha iyidir.
 
Vladimir Simakov :
Evet ve başka birinin makro ikamesini değiştirmek kötüdür.

Bu kötülük olmasaydı, bu olmazdı .

 
Vladimir Simakov :
Evet ve başka birinin makro ikamesini değiştirmek kötüdür. Özellikle bunlar önceden tanımlanmış ortam makrolarıysa. Tüm proje dosyalarını birleştirdikten sonra, makro yeniden tanımlamasının sonunda nerede görüneceğini asla bilemezsiniz. _VALUE makronuzu tanımlamak daha iyidir.
DEĞER değerinin global bir değişkene atanmasının ve onu çarpmanın ve son tanımlamada yerine koymanın neden imkansız olduğu sorulabilir.
 
Valeriy Yastremskiy :
DEĞER değerinin global bir değişkene atanmasının ve onu çarpmanın ve son tanımlamada yerine koymanın neden imkansız olduğu sorulabilir.

Bu mümkündür, ancak daha sonra makro ikame anlamı kaybolur (koddaki ikame değerleri). Derleyici için tüm umut, const türünü (bu arada, değişkenin türüne karar verdiniz mi?) C++ constexpr türüne dönüştüreceği yönünde kalacaktır.

Ve evet, yapabilirsin

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

Ve evet, yapabilirsin

Bununla binmeyin.

 void Func( int = VALUE ) {}
 
fxsaber :

Bununla binmeyin.

İyi evet. Constexpr'e tekrar soralım ki böyle olabilsin
constexpr auto x = 100 ;

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

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

Büyük olasılıkla, bu yaklaşım hiçbir yerde çalışmıyor. Çünkü sağdaki VALUE tanımlanmadığında böyle bir değiştirme var.

Görünüşe göre, derleyicinin nasıl çalıştığını anlamıyorum. Satırların sırayla ayrıştırıldığını temsil etti. Yani sağda tanımsız bir değer yok:

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

Görünüşe göre, derleyicinin nasıl çalıştığını anlamıyorum. Satırların sırayla ayrıştırıldığını temsil etti. Yani sağda tanımsız bir değer yok:

Metin değiştirme gibi yukarıdan aşağıya çalışır. Onlar. "TMP", "DEĞER" ile değiştirilecektir.

 
Andrey Khatimlianskii :

Görünüşe göre, derleyicinin nasıl çalıştığını anlamıyorum. Satırların sırayla ayrıştırıldığını temsil etti. Yani sağda tanımsız bir değer yok:

Bu bir derleyici değil - bir önişlemcidir)

 #define VALUE (TMP* 2 )

dönüşür

 #define VALUE (VALUE* 2 )

ve VALUE sizin için tanımlanmadı