SORU
13 AĞUSTOS 2014, ÇARŞAMBA


Neden bir makro savunmak ve bir fonksiyon değil mi?

Benim öğretim görevlisi sınıf içinde, ve merak ediyordum o bana sordu neden bir fonksiyon yerine bir makro.

CEVAP
13 AĞUSTOS 2014, ÇARŞAMBA


En basit açıklama, standart assert draft C99 standard bakacak olursak bir makro olmasını gerektiren olacakbölümleri söyleyebileceğim kadarıyla draft C11 standard de aynı) Bölüm 7.2Tanılamaparagraf2diyor ki:

Makro bir gerçek olarak bir makro olarak uygulanır iddia işlevi. Eğer makro tanımında bir erişim için gizli ise gerçek işlevi, davranışı tanımsızdır.

Neden bu gerekli mi, gerekçe Rationale for International Standard—Programming Languages—C olarak verilmektedir

Makro için sınırlı ya da gerçek bir işlevi savunmak için zor veya imkansız olabilir form.

çok bilgilendirici değil, ama diğer şartları yerine neden böyle olduğunu görebiliriz. 7.2 Bölüm paragraf geri dönüyor1diyor ki:

Eğer BU kaynak dosya içinde bu noktada bir makro adı olarak tanımlanan [...] nerede bulunur, makro sadece iddia olarak tanımlanır

#define assert(ignore) ((void)0)

Makroyu yeniden BU şu anki durumuna göre iddia her zaman buna dahildir.

Bu bizi potansiyel olarak pahalı çekler mal almak isteyebilirsiniz serbest modunda iddialar kapatmak için kolay bir yol sağladığından önemlidir.

ve ikinci önemli şart makrolar __FILE__, __LINE__ Bölüm 7.2.1.1 kaplı __func__, kullanmak için gerekli olmasıdırMakro iddiadiyor ki:

[...] makro belirli bir çağrı hakkında bilgi yazar belirt başarısız [...] ikincisi değerleri sırasıyla önişleme ___ _ ve __SATIR_ _ ve tanımlayıcı DOSYASI makrolar uygulama tanımlı biçim bir standart hata akışı __işlev_ _).165)Daha sonra iptal işlevini çağırır.

nerede Dipnot 165 diyor ki:

Mesaj yazılı olabilir:

Assertion failed: expression, function abc, file xyz, line nnn.

Bir makro olarak sahip makrolar __FILE__ vb sağlar... Joachim belirttiği gibi doğru yerde değerlendirilecek ve makro olmak orijinal eklemek için izin veririfadeileti oluşturur.

Taslak C standardı cassert Başlığı içeriğini Standrd C kütüphanesinden: assert.h Başlığı aynı olmasını gerektirir

İçeriği Standart C kütüphanesi başlığı ile aynıdır .

Ayrıca bakınız: ISO C 7.2.

Neden (geçersiz)0?

Neden hiçbir şey yapmayan başka bir ifadesi olarak karşı (void)0 kullan? Birkaç sebep bulabiliriz, ilk bu 7.2.1.1 bölüm: Özet görünüyor iddia

void assert(scalar expression);

ve diyor kivurgu benim):

Bu programlara tanı testleri; makro koyar iddiageçersiz bir ifade için genişler.

ifadesi (void)0 ile bitirmek gerek ile tutarlıdırifade geçersiz.

Farz etmedik bu gereksinim, diğer olası ifadeler olabilir istenmeyen etkiler gibi izin kullanır assert serbest modu olmaz izin hata ayıklama modu için örnek kullanarak plain 0 ki izin kullanma assert atama ve kullanıldığında doğru olur muhtemelen oluşturmak expression result unused uyarı. Bir kullanan olarakbileşik deyimbir yorum da anlaşılacağı gibi, onlar bir bazı durumlarda istenmeyen etkileri C multi-line macro: do/while(0) vs scope block görebiliriz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • H3Ctic (old channel)

    H3Ctic (old

    23 Mart 2011
  • Majestic Casual

    Majestic Cas

    28 NİSAN 2012
  • TantalizingTrance

    TantalizingT

    15 ŞUBAT 2009