2012-03-30 16 views
16

aşağıdaki gibi bir kod parçası geldi? Durum düzgün bir şekilde uygulanacak mı?#if tanımlı (x) || (y); bu geçerli mi?</p> <pre><code>#if defined(x) || y </code></pre> <p>yukarıdaki deyimi ne demektir: Bir inceleme sırasında

+0

* Yürüt * doğru sözcük değil. Bu kod derleme zamanında önceden işlenir. Sözdiziminin doğruluğundan emin değilim, ama en çok * değerlendirilebilir * ancak genellikle "#if tanımlı (x)" in doğru sözdizimi "#IFDEF x" –

cevap

20

Evet geçerlidir. İşte

Standardı (C99) 6.10p1 diyor budur:

if-group: 
# if constant-expression new-line groupopt 
# ifdef identifier new-line groupopt 
# ifndef identifier new-line groupopt 

defined operatör sabit ifadesi (6.10.1p1) ait tekli operatör parçası olarak görülüyor. Makro x tanımlanır eğer örnekte

, koşul doğru olarak değerlendirilir VEYA y 0

3

Evet, defined(x) bir boolean olduğundan ve true veya false değerini döndürür.

Yukarıdaki ifade, "x, tanımlı veya y doğru" anlamına gelir.

+5

... veya her ikisi de olabilir. :) – phimuemue

10

daha tanımlanmış ve farklı ise bunun için akıl iki yönlüdür. bunun (&&, || vs.) mantıksal operatörler kullanmak üzere düzgün dahildir böylece kodunuzu çoğaltmak gerekmez böylece yerine #ifdef kullanmanın

, sen defined operatörünü kullanın Tanımlamanız gerekenler için birden fazla ölçüt varsa. Bence da

, , ben çok daha kolay #ifdef x daha #if defined(x) olarak okumayı bulmak ve bu #ifdef ile mümkün değildir, oysa #if defined(x) && defined(y) aşağıdaki yapabilirdi.

1

Bu doğru ama kötü bir uygulama. Neden bir koşulda iki farklı değerlendirme ('y' ve 'tanımlı (x)') kullanırız. Başkaları için kafa karıştırıcı olabilir. Aşağıdaki örnek || ve # tanımlanmış makroları karşı & & operatiors:

#define AA 1 
#define BB 2 
#if (defined AA) || (defined BB) 
    #warning "A or B" 
#endif 
#if (defined AA) && (defined BB) 
    #warning "A and B" 
#endif 

Yukarıdaki kod kullanıcı ekranda bu mesajları alacağı çalıştırıldı Ne zaman:

#warning "A or B" 
#warning "A and B" 

Ama kodu (AA tanımsız oldu) böyle olsaydı:

#undefine AA 
#define BB 2 
#if (defined AA) || (defined BB) 
    #warning "A or B" 
#endif 
#if (defined AA) && (defined BB) 
    #warning "A and B" 
#endif 

sonra kullanıcı bu mesajı alacak:

#warning "A or B" 
+0

burada kullandığınız sözdiziminin farklı olduğunu unutmayın: "tanımlı (x)" yerine "tanımlı x". her ikisi de aynı sonucu verir. – StarShine

İlgili konular