2013-04-26 21 views
41

Aşağıdaki iki kod snippet'ının hangisi doğru/tercih edilen ve neden derleyici yönergeleri kullanılırken bana açık değildir. Görünen çoğu geliştiricinin ve Açık Kaynak projesinin ilkini kullandıkları görülüyor, ancak ikinci sık kullanılanları da gördüm. Yukarıdaki kod pasajlarının kodu yalnızca hata ayıklama sırasında ve neden çalıştırmak için tercih edilir#ifdef DEBUG versus #FDBUG

#if DEBUG 
[self doSomethingOnlyWhenDebugging]; 
#endif 

KARŞI

#ifdef DEBUG 
[self doSomethingOnlyWhenDebugging]; 
#endif 

? Tahminim, DEBUG, DOĞRU tanımlandığında ve DOĞRU olarak ayarlandığında, ikinciin çalışacağı DOĞRU veya YANLIŞ olarak tanımlanırsa, ilk çalıştırılacak olmasıdır. Bu doğru mu?

+9

'# ifdef' yalnızca sembolün tanımlandığını sınar.'# 'sembolün VALUE değerini test eder. FOO 0 ', #ifdef FOO'yu true yapacak, ancak #if FOO'yu yanlış yapacak, çünkü #if 0'ı yapıyor. –

+0

"Kök" tanımını bulmaya çalışmalı ve değerin 1/0 değeri mi yoksa varolan/yok olan mı olduğunu belirlemek için girişimde bulunmalısınız. Onları yanlış anlayarak "beklenmedik" sonuçlar doğurabilir. –

cevap

35

Siz haklısınız. #if DEBUG, DEBUG'un 0 olarak tanımlanmış olup olmadığını değerlendirmez. Her ne zaman kullanılacağına gelince

, size sadece önişlemci tanımı varsa böyle ayıklama günlüğünü ekleme gibi, kodu ekleyin gereken her şey için #ifdef kullanarak sopa olabilir. Değeri incelemeniz ve farklı derleme yollarına gitmeniz gerekiyorsa, 0 veya 1 kullanırdım. Bunun iyi bir örneği, bir iOS projesi için her zaman tanımlanmış olan TARGET_IPHONE_SIMULATOR, ancak simülatör için derleme yapıyorsanız yalnızca 1. Bildiğim kadarıyla

+1

Bu yüzden, sadece Simülatörde bir kod satırı yürütmek isteseydim, Simülatörde çalışıp çalışmadığımı dikkate almadan 'TARGET_IPHONE_SIMULATOR' tanımlandığından' # if' kullanılmalıdır. Doğru? – lidsinker

+2

@lidsinker doğru – Kevin

+0

iyi açıkladı. Çok teşekkür ederim –

6

, en güzel seçimdir: o zaman

#ifndef DEBUG 
    NSLog(@"-1"); 
#elif DEBUG == 0 
    NSLog(@"0"); 
#else 
    NSLog(@"%d", DEBUG); 
#endif 

, sen #ifndef DEBUG tüm diğerlerinin üstünde tercih edilir bilecektir. -Wundef derleyici bayrağı açıksa

#if DEBUG == 0 // DEBUG is not defined or defined to be 0 
    // do sth 
#else 
    // do sth 
#endif 

Ancak, #if DEBUG == 0 ile uyarı bir olabilir: daha basit bir seçim var.

1

DEBUG'un tanımlandığı veya tanımlanmadığı koda bakmanız ve kodunuzu buna göre yazmanız gerekir. DEBUG ile tanımlanmadığını veya 1 değeriyle tanımlandığını göreceksiniz. Yani #if DEBUG veya #ifdef DEBUG çalışacaktır.

Sizin kontrolünüz altında olan #define için, bunları her zaman 0 veya 1 değeriyle tanımlamanızı öneririz. Daha sonra değeri kontrol etmek için #if kullanabilirsiniz, ancak bunları doğrudan kodunuzu daha okunabilir hale getirebilecek sıradan bir ifade veya bir ifadede. Ve her zaman tanımlandığından, tanımlandığı yere gitmek ve nasıl ve neden ayarlandığını kontrol etmek için Xcode'ta "Tanım için Atla" yı kullanabilirsiniz. Bunun yerine ya #define ya da #define değerini değil, ve o tanımlanmamışsa, Xcode, kaynak kodunuzun nerede tanımlanmadığını bilmiyor. Ayrıca yanlış yazılan kullanımlara bakma şansı verir. "Tanıma Atla" çalışmıyorsa, yanlış yazdığını biliyorsunuz demektir. Bir #if yönergesi kapsamında BTW

Yani #if DEBUG DEBUG tanımlı değil veya DEBUG 0 olarak tanımlanır ve eğer DEBUG olarak tanımlanır eğer derlemek etmezse çalışacak 0'a ile değiştirilir tanımlanmamış herhangi makro hiçbir şey - size neyin yanlış olduğunu söyleyebilmeniz için düzeltebilirsiniz. Bu bakış açısından #if kullanılması, derleme yapılmadığı sürece daha iyidir.