SORU
1 ŞUBAT 2012, ÇARŞAMBA


Makro vs C Fonksiyonu

C programlama yapıyorum

Ben her zaman bir makro kullanarak işlevini kullanarak daha iyi olduğu örnekler ve vaka gördüm.

Birisi örnek bir makro işlevi göre dezavantajı bana açıklayabilir mi?

CEVAP
1 ŞUBAT 2012, ÇARŞAMBA


Makrolar metinsel ikame güveniyor ve yazım denetimi gerçekleştir çünkü eğilimli hata. Örneğin, bu makro:

#define square(a) a*a

gayet iyi çalışıyor bir tam sayı ile kullanıldığında:

square(5) --> 5*5 --> 25

ama ifadeleri ile kullanıldığında çok tuhaf şeyler yapar:

square(1 2) --> 1 2*1 2 --> 1 2 2 --> 5
square(x  ) --> x  *x   --> increments x twice

Tartışmalar koyarak parantez yardımcı olur ama tamamen bu sorunları çözmüyor.

Makrolar birden çok ifadeleri içeren, kontrol-akış yapıları ile derde girebilir:

#define swap(x,y) t=x; x=y; y=t;
if(x<y) swap(x,y); -->
if(x<y) t=x; x=y; y=t; --> if(x<y) { t=x; } x=y; y=t;

Bu tabloların içine koymaktır tamir için olağan bir strateji "{ ... } while(0)" döngü.

Eğer aynı isim ama farklı kelimelerle alanı içerir başına iki yapı varsa, aynı makro garip sonuçlar ile hem de işe yarayabilir:

struct shirt {
    int numButtons;
};

struct webpage {
    int numButtons;
};

#define num_button_holes(shirt)  ((shirt).numButtons * 4)

struct webpage page;
page.numButtons = 2;
num_button_holes(page) -> 8

Son olarak, makrolar olabilir zor hata ayıklama, üreten garip sözdizimi hataları veya çalışma zamanı hataları var genişletmek için anlamak (örneğin gcc -E), çünkü hata olamaz adım makrolar, bu örnekte olduğu gibi:

#define print(x, y)  printf(x y)  /* accidentally forgot comma */
print("foo %s", "bar") /* prints "foo %sbar" */

Satır içi işlevler ve sabitler, makrolar ile bu sorunların çoğunu önlemek için yardımcı, ama her zaman geçerli değil. Makrolar kasten polimorfik davranış belirtmek için kullanıldığı, kasıtsız polimorfizmi önlemek için zor olabilir. C makroları kullanmadan typesafe bir şekilde şablonlar gibi özellikleri karmaşık polimorfik yapıları oluşturmak yardımcı olmak için bir numarası vardır; Stroustrup bakınC Programlama Diliayrıntılar için.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ampisound

    Ampisound

    12 Kasım 2006
  • buttheadgsxr1000

    buttheadgsxr

    24 Ocak 2008
  • Pituvision

    Pituvision

    11 Mart 2006