Hatalar, hatalar, sorular - sayfa 2866

 

Her şey mümkün, sadece bir makro eklemeniz yeterli

 #define VALUE 10

MACRO( VALUE, VALUE2 )

#define VALUE   VALUE2* 2

void f( int i = VALUE ) { Print ( i ); }
void OnStart ()
{
        f();
}

Sonuç: 20

 
A100 :

Her şey mümkün, sadece bir makro eklemeniz yeterli

Sonuç: 20

Bu çok iyi. Bilmeceleri çözmek zordur.

 
Vladimir Simakov :

Kusura bakmayın açıklamaya çalışırken kafam karıştı.

Tekrar:

DEĞER'in ikinci tanımı sırasında, DEĞER makrosu tanımlanmamıştır, dolayısıyla DEĞER şu şekilde tanımlanmıştır:

, çünkü TMP VALUE olarak tanımlandı ve tanımlanmaya devam ediyor.

Ancak TMP, DEĞER'in ikinci tanımından sonra zaten şurada ortaya çıkıyor:

Bunun gibi bir şey))

Önişlemcide tam olarak ne olduğu ikame edilir ve nasıl olduğu ve nerede tanımlandığı önemli değildir. Bu nedenle, onunla dikkatli olmanız gerekir. Misal:

, ve şimdi işleve kötülüğü, yani bir yan etkiyi ekleyelim.

Ve bu sadece bir yazıt, ama ya depozito bu işleve bağlıysa?

komik) geldiğinde)

 #define VALUE 10         
#define TMP VALUE       
#undef VALUE     

doğru anlaşıldığında, değişikliğin iptalinden sonra, ilk satır artık 10 değil ve ikinci TMP DEĞER'dir, ancak 10 değil. Yani. ikame atamadan uzaktır.

 
Valeriy Yastremskiy :

komik) geldiğinde)

doğru anlaşıldığında, değişikliğin iptalinden sonra, ilk satır artık 10 değil ve ikinci TMP DEĞER'dir, ancak 10 değil. Yani. ikame bir atama değildir.

Evet. Bir ikame sadece bire bir ikamedir. Tam olarak, kodun içine değiştirirken ( önişlemci yönergesi ile karıştırılmamalıdır), DEĞER makrosu tanımlanırken, önişlemci daha fazla TMP-> DEĞER-> 10 ve değilse, TMP-> DEĞER'i genişletir. Aynı zamanda, önişlemci yönergeleri kodun kendisinde yer almaz, derleme sırasında artık orada değildirler. Misal:

 #define VALUE 10
#define TMP VALUE

void OnStart ()
{
   Print (TMP); //10
if ( false ){
   #undef VALUE
   #define VALUE 20
   Print (TMP);}
else Print (TMP); //20
}
 
Vladimir Simakov :

Evet. Bir ikame sadece bire bir ikamedir. Tam olarak, kodun içine değiştirirken ( önişlemci yönergesi ile karıştırılmamalıdır), DEĞER makrosu tanımlanırken, önişlemci daha fazla TMP-> DEĞER-> 10 ve değilse, TMP-> DEĞER'i genişletir. Aynı zamanda, önişlemci yönergeleri kodun kendisinde yer almaz, derleme sırasında artık orada değildirler. Misal:

Evet, ikinci ikame VALUE 20'yi yorumlarsanız, VALUE değişkeninin bildirimi kaybolacak ve derleyici bunu göremeyecek ve azarlamayacaktır)

 
A100 :

Her şey mümkün, sadece bir makro eklemeniz yeterli

Sonuç: 20

Pes ediyorum)))

Nasıl tanımlanmış

MACRO

?

 
Vladimir Simakov :

vazgeçtim )))

Nasıl tanımlanmış

?

Çok hızlı? Henüz tüm uzmanlar bağlanmadı ... bir hafta bekleyeceğiz

İpucu: Bu da işe yarar (ancak çözüm biraz farklıdır)

 #define VALUE1 10
#define VALUE2 5

MACRO2( VALUE1, VALUE12 )
MACRO2( VALUE2, VALUE22 )

#define VALUE1  VALUE12* 2
#define VALUE2  VALUE22* 3

int f1( int i = VALUE1 ) { return i; }
int f2( int i = VALUE2 ) { return i; }
void OnStart ()
{
        Print(f1(),":",f2());
}

Sonuç: 20:15

 
Vladimir Simakov :

sonuçta, TMP, bizim gibi, tanımlı DEĞER olarak kaldı.

İşte "yukarıdan aşağıya" kelimelerinin bir reddi.

Aksi takdirde, TMP "olduğu gibi tanımlandığı gibi" olmaz, ancak daha önce 10 ile değiştirilirdi (bu, DEĞER ile değiştirilir).

Bu, önişlemcinin kodu satır satır işlemediği anlamına gelir. Nasıl olduğunu bulmak için kalır.


@ A100 , özetle, zorlaştırmıyorsa.
Google'da aratıp okuyacak kadar ilgi çekici değil ama soracak kadar.

Benim mantığımda yanlış olan ne?

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
 
A100 :

İpucu: Bu da işe yarar (ancak çözüm biraz farklıdır)

Eylemde MACRO ve MACRO2 ile çok aynı.

 
Andrey Khatimlianskii :

Benim mantığımda yanlış olan ne?

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