Gelen C / C ++
Bir #if 0
/ #endif
bloğu arasına yerleştirilen koda ne olur ?
#if 0
//Code goes here
#endif
Kod basitçe atlanıyor ve bu nedenle yürütülmüyor mu?
Gelen C / C ++
Bir #if 0
/ #endif
bloğu arasına yerleştirilen koda ne olur ?
#if 0
//Code goes here
#endif
Kod basitçe atlanıyor ve bu nedenle yürütülmüyor mu?
Yanıtlar:
Sadece yürütülmez, derlenmez bile.
#if
gerçek derleme adımından önce değerlendirilen bir ön işlemci komutudur. Bu bloğun içindeki kod, derlenmiş ikili dosyada görünmez.
Genellikle kod bölümlerini daha sonra yeniden açmak amacıyla geçici olarak kaldırmak için kullanılır.
Tek bir önemli fark dışında, bloğu yorumlamakla aynıdır: Yuvalama bir sorun değildir. Bu kodu düşünün:
foo();
bar(x, y); /* x must not be NULL */
baz();
Yorum yapmak istersem şunları deneyebilirim:
/*
foo();
bar(x, y); /* x must not be NULL */
baz();
*/
Bzzt. Sözdizimi hatası! Neden? Blok yorumların iç içe geçmemesi nedeniyle (SO'nun sözdiziminin vurgulamasından da görebileceğiniz gibi) */
"NULL" kelimesinden sonra gelen açıklama, baz
çağrının yorum yapılmamasına ve */
sonra baz
da sözdizimi hatasına yol açarak yorumu sonlandırır . Diğer yandan:
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
Her şeyi yorumlamak için çalışıyor. Ve #if 0
s'ler birbirleriyle yuva yapacaklar, şöyle ki:
#if 0
pre_foo();
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
quux();
#endif
Tabii ki bu biraz kafa karıştırıcı olabilir ve doğru yorumlanmazsa bakım sorunu haline gelebilir.
foo.c:3: unterminated string or character constant
, ne kullanıyorsun?
Bir #if 0… #endif bloğu tam olarak ne yapar?
Yazarın açıkça bir sürüm kontrol sistemi duymadığını söyler. Bu da size mümkün olduğunca uzağa kaçmanızı söyler ...
Önişlemci # gördüğünde, sonraki belirtecin sıfır olmayan bir değere sahip olup olmadığını kontrol ederse. Varsa, derleyici için kodu etrafta tutar. Olmazsa, bu koddan kurtulur, böylece derleyici onu asla görmez.
Birisi # if 0 derse, kodu etkili bir şekilde yorumluyor, böylece asla derlenmeyecek. Bunu, sanki etrafına / * ... * / ekledikleri gibi düşünebilirsiniz. Tam olarak aynı değil, ama aynı etkiye sahip.
Ne olduğunu ayrıntılı olarak anlamak istiyorsanız, sık sık bakabilirsiniz. Pek çok derleyici, önişlemci çalıştıktan sonra dosyaları görmenize izin verir. Örneğin, Visual C ++ üzerinde switch / P komutu ön işlemciyi çalıştıracak ve sonuçları bir .i dosyasına koyacaktır.
#if WIN32 || __CYGWIN__
ama bu beklendiği gibi çalışıyor.
Bir ile başlayan satırlar #
vardır önişlemci direktifleri . #if 0 [...] #endif
bloklar derleyiciye ulaşmaz ve makine kodu oluşturmaz.
Bir kaynak dosyayla önişlemciye ne olduğunu gösterebilirsiniz ifdef.cxx
:
#if 0
This code will not be compiled
#else
int i = 0;
#endif
Koşu gcc -E ifdef.cxx
size neyin derlendiğini gösterecektir.
Geliştirme döngüsü sırasında bir kod bloğunun derlenmesini önlemek için bu mekanizmayı kullanmayı tercih edebilirsiniz, ancak kodunuza sadece hamleler eklediği ve okunabilirliği azalttığı için muhtemelen onu kaynak kontrolünüze eklemek istemezsiniz. Yorumlanmış tarihsel bir kod parçasıysa, kaldırılması gerekir: kaynak kontrolü geçmişi içerir, değil mi?
Ayrıca, cevap her ikisi için aynı olabilir C ve C ++ ancak C / C ++ ve denir hiçbir dil, böyle bir dili belirtmek için iyi bir alışkanlıktır orada yer etmedi.
Pek değil
int main(void)
{
#if 0
the apostrophe ' causes a warning
#endif
return 0;
}
Gcc 4.2.4 ile "tc: 4: 19: uyarı: eksik sonlandırma 'karakteri" gösterir.
Yorum yapmanın ucuz bir yolu, ancak hata ayıklama potansiyeline sahip olabileceğinden şüpheleniyorum. Örneğin, değerleri bir dosyaya çıkaran bir yapıya sahip olduğunuzu varsayalım. Bunu son sürümde istemeyebilirsiniz, böylece #if 0 ... #endif kullanabilirsiniz.
Ayrıca, hata ayıklama amacıyla bunu yapmanın daha iyi bir yolunun aşağıdakileri yapmaktan şüpheleniyorum:
#ifdef DEBUG
// output to file
#endif
Bunun gibi bir şey yapabilirsiniz ve bu daha mantıklı olabilir ve tek yapmanız gereken sonuçları görmek için DEBUG'ı tanımlamaktır.
//
önüne veya ile bölüme başlayıp bölümü ile/*
sonlandırmak gerekirdi*/
. İkinci tekniklerle ilgili sorun, yorumun iç içe geçmemesidir, bu nedenle geliştiricinin*/
başlangıç ve bitiş arasındaki her şeyi kontrol etmesi ve işlemesi gerekir .