SORU
30 EYLÜL 2008, Salı


-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
30 EYLÜL 2008, Salı


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • atKristaBradford

    atKristaBrad

    4 Aralık 2010
  • Keith Anthe

    Keith Anthe

    26 NİSAN 2011
  • NikkoNantone

    NikkoNantone

    21 Kasım 2011