SORU
30 EKİM 2009, Cuma


Static_assert ne yapar ve ne için kullanmak istiyorsunuz?

static_assert(...) 'C 0x' elde sorun zarif bir şekilde çözecek bir örnek verebilir misiniz?

Çalışma zamanı assert(...) aşinayım. static_assert(...) düzenli tercih assert(...) etmeliyim?

Ayrıca, bir şey BOOST_STATIC_ASSERT yok boost static_assert(...) aynı mı?

CEVAP
30 EKİM 2009, Cuma


Statik derleme zamanında iddialar yapmak için kullanılır iddia. Statik onaylama işlemi başarısız olduğunda, program sadece derleme değildir. Bu eleştirel işlevi tam olarak 32 bit olan unsigned int nesneye bağlı kodu ile bazı uygularsanız farklı durumlarda yararlıdır, örneğin gibi. Bir statik böyle iddia koyabilirsiniz

static_assert(sizeof(unsigned int) * CHAR_BIT == 32);

kodunuzda. Başka bir platform ile farklı boyutta unsigned int tür derleme başarısız olur, böylece dikkatleri geliştirici sorunlu kısmı kod ve danışmanlık onları yeniden uygulamak veya yeniden inceleyin.

Başka bir örnek, belki geçmek istiyorum bazı integral değeri olarak void * işaretçi işlevi (bir hack ama yararlı bazen) ve istediğiniz emin olmak için integral değeri sığacak içine işaretçi

int i;

static_assert(sizeof(void *) >= sizeof i);
foo((void *) i);

char bu tür imzalı portföy isteyebilirsiniz

static_assert(CHAR_MIN < 0);

ya da negatif değerler ile ayrılmaz bir bölümü sıfıra doğru yuvarlar

static_assert(-5 / 2 == -2);

Ve benzeri.

Çalıştırma birçok durumda statik iddialar iddialar yerine kullanılabilir, ama çalıştırma iddialar sadece çalışma, çalıştırma ve kontrol geçer sadece iddia. Bu nedenle çalıştırma başarısız bir onaylama işlemi, uzun süre hareketsiz yatıyordu tespit edilmemiş olabilir.

Tabii ki, statik onaylama ifadesi, derleme zamanı sabiti olmalı. Çalışma zamanı değeri olamaz. Çalışma zamanı değerleri için başka bir seçenek var ama sıradan kullanım assert.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • dcigs

    dcigs

    9 EYLÜL 2006
  • Dirty Loops

    Dirty Loops

    21 Mayıs 2007
  • Joe DiFeo

    Joe DiFeo

    7 AĞUSTOS 2012