Hatalar, hatalar, sorular - sayfa 2865

 

Pazar için yeni bir ürün yaratmak mümkün değil, hata 500 yazıyor.

Ürün oluşturuldu ve kontrolleri geçti, kişisel hesapta yayınlandı diyor, ancak bağlantıya tıkladığınızda 500 yanıt alıyorsunuz.

 
fxsaber :

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

Vladimir Simakov :

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

dönüşür

ve VALUE sizin için tanımlanmadı

Ve undef nasıl çalışmalı?

 
Andrey Khatimlianskii :

Ve undef nasıl çalışmalı?

Bu noktaya kadar bir "metin değiştirme" var.

 
Vladimir Simakov :

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

dönüşür

ve VALUE sizin için tanımlanmadı

 #define VALUE (VALUE* 2 )

VALUE * 2 değer türünün const olduğunu ve ikamenin kendisine bağlı olduğunu doğru anlıyorum, yani. ve DEĞER de bir sabittir. Derleyici iki sabit oluşturur.

Eğer öyleyse, muhtemelen yeni bir ikame oluşturuyor

 #define VALUE1 (VALUE* 2 )
#define VALUE VALUE1

VALUE, kodda yukarıda bir sabit tarafından tanımlanmışsa bu doğru değildir.

 
fxsaber :

Bu noktaya kadar bir "metin değiştirme" var.

Yakınsama olmaz, TMP'yi VALUE olarak değiştirir   sonra olan "#define DEĞER (TMP*2)" satırında.

 
Andrey Khatimlianskii :

Yakınsama olmaz, TMP'yi VALUE olarak değiştirir   sonra olan "#define DEĞER (TMP*2)" satırında.

 #define MACROS TEXT
 // В этом интервале везде идет замена в исходнике MACROS на TEXT, как делалось бы в текстовом редакторе.
#undef MACROS
Ve böylece değiştirmeler her şey bitene kadar devam eder.
 
fxsaber :
Ve böylece değiştirmeler her şey bitene kadar devam eder.

Bir kod var:

 #define VALUE 10        // 
#define TMP VALUE       // 
#undef VALUE           // 
#define VALUE (TMP* 2 )   // 

İlk değiştirme, kod boyunca DEĞERİ 10 olarak değiştirir ve #undef DEĞER 'a kadar şunu bırakır:

 #define TMP 10
#define VALUE (TMP* 2 )

Bir sonraki değişiklik TMP'yi 10 olarak değiştirir.

 #define VALUE ( 10 * 2 )

ben nerdeyim aptal

 
Andrey Khatimlianskii :

Bir kod var:

İlk değiştirme, kod boyunca DEĞERİ 10 olarak değiştirir ve #undef DEĞER 'a kadar şunu bırakır:

Bir sonraki değişiklik TMP'yi 10 olarak değiştirir.

ben nerdeyim aptal

TMP yerine 10 değil DEĞER değiştirilir, ancak DEĞER tanımlanırsa (burada bir pusu), zaten 10

Adım adım bakın:

 #define VALUE 10         
#define TMP VALUE       
#undef VALUE            
#define VALUE (TMP* 2 )

void OnStart ( void )
{
   Print (VALUE)
}

Önişlemci dürüstçe Print'in yerine geçer

 Print ((TMP* 2 ));

, bundan sonra, yine, aldatmadan her şey, TMP yerine neyi değiştirir? Doğru şekilde:

 Print ((VALUE* 2 ));

, ardından tüm önişlemci yönergelerini siler ve ancak bundan sonra bu, derleyiciye iletilir:

 void OnStart ( void )
{
   Print ((VALUE* 2 ));
}
 
Vladimir Simakov :

TMP yerine 10 değil DEĞER değiştirilir, ancak DEĞER tanımlanırsa (burada bir pusu), zaten 10

Adım adım bakın:

Önişlemci dürüstçe Print'in yerine geçer

, bundan sonra, yine, aldatmadan her şey, TMP yerine neyin yerini alıyor? Doğru şekilde:

, ardından tüm önişlemci yönergelerini siler ve ancak bundan sonra bu, derleyiciye iletilir:

Yukarıdan aşağıya denilmez.

 
Andrey Khatimlianskii :

Yukarıdan aşağıya denilmez.

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

Tekrar:

 #define VALUE 10         
#define TMP VALUE       
#undef VALUE            
#define VALUE (TMP* 2 )

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:

(VALUE* 2 )

, çü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:

(TMP* 2 )

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:

 #define min(A,B) ((A)<(B)?(A):(B))

long Foo( int x) { return x*x;}

void OnStart ( void )
{
   int a= 500 ,
       b= 20 ;
   Print (min( 500 ,Foo(b))); //400
}

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

 #define min(A,B) ((A)<(B)?(A):(B))

long Foo( int x){
   Print ( "Увидивший это второй раз - нубяра vulgaris" );
   return x*x;}

void OnStart ( void )
{
   int a= 500 ,
       b= 20 ;
   Print (min( 500 ,Foo(b)));
}

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