-Eğer başka bir C/C makro ifadeleri Do-While ve
Birçok C/C makro ** 10, anlamsız bir döngü gibi görünüyor ne sarılmış kodu görüyorum makrolar. İşte örnekler.
#define FOO(X) do { f(X); g(X); } while (0)
#define FOO(X) if (1) { f(X); g(X); } else
do while
ne yaptığını göremiyorum. Neden sadece o olmadan bu yazmak değil mi?
#define FOO(X) f(X); g(X)
CEVAP
do ... while
if ... else
orada bir hale getirmek için
makro sonra noktalı virgül her zaman aynı şeyi ifade ediyor. Sana söyleyeyim
ikinci makro gibi bir şey vardı.
#define BAR(X) f(x); g(x)
Şimdi ise eğer ifadesi organları küme parantezleri sarılı değildi if ... else
deyim BAR(X);
kullanmak olsaydı, kötü bir sürpriz olsun istiyorum.
if (corge)
BAR(corge);
else
gralt();
Yukarıdaki kodu içine genişletin
if (corge)
f(corge); g(corge);
else
gralt();
sözdizimsel başka artık ile ilişkili olduğu için yanlış olan. Parantez sonra bir noktalı virgül sözdizimsel olarak yanlış olduğundan makro içinde kaşlı şeyler sarmak için yardım etmez.
if (corge)
{f(corge); g(corge);};
else
gralt();
Bu sorunu gidermek için iki yol vardır. İlk bir ifade gibi hareket kabiliyetini soyarak olmadan makro içinde sırası açıklamaları için virgül kullanın.
#define BAR(X) f(X), g(X)
Bar yukarıdaki sürüm BAR
sözdizimsel olarak doğru olan ne aşağıdaki kod, yukarıdaki genişletir.
if (corge)
f(corge), g(corge);
else
gralt();
Bu f(X)
yerine kendi bloğunda git, örneğin yerel değişkenleri bildirmek için söylemek gereken kod daha karmaşık bir vücudun varsa çalışmıyor. En genel durumda çözüm do ... while
gibi bir şey makro karışıklık olmadan noktalı virgül götüren tek bir deyimi neden için kullanmaktır.
#define BAR(X) do { \
int i = f(X); \
if (i > 4) g(i); \
} while (0)
Gerek yok kullanın do ... while
, elinden yemek bir şey if ... else
de, ancak ne zaman if ... else
genişletir içinde bir if ... else
yol için bir "dangling else", hangi-ebil yapmak bir varolan sarkan başka sorunu daha da zor bulmak için, aşağıdaki kodda olduğu gibi.
if (corge)
if (1) { f(corge); g(corge); } else;
else
gralt();
Bu noktadan sarkan bir noktalı virgül hatalı olduğu bağlamlarda noktalı virgül kullanın. Tabii ki, (ve muhtemelen) daha iyi gerçek bir işlevi, bir makro olarak BAR
ilan etmek olurdu ki bu noktada söylenebilir.
Özet olarak, do ... while
C ön işlemci eksiklikleri gidermek için vardır. Bu C stil kılavuzları C ön işlemci rahat biraksin, bu konuda endişeli olduklarını türden bir şey.
Neden ifadeleri benim fonksiyonlarını ...
C tanımı büyük veya küçük indian india...
Başka bir javascript işlevi geçirmeden...
Başka bir aktivite bir aktiviteyi tama...
İf-else veya başka herhangi bir karşıl...