2010-08-14 28 views
5

Geçtiğimiz günlerde, C++ 'da iki türün boyutlarının eşit olduğunu kontrol etmek için derleme zamanı iddialarına sahip olma ihtiyacını buldum.C++ dilinde derleme zamanı iddiaları?

#define X_ASSERT(condition) ((void)sizeof(char[1 - 2*!!(condition)])) 

Öyle gibi kullanılabilir:

Ben (Linux çekirdeğinden geldiği belirtilen) web üzerinde aşağıdaki makro bulundu

X_ASSERT(sizeof(Botan::byte) != sizeof(char)); 

Bu beni merak alır - bu halde , çalışır, bunu yapmanın daha temiz bir yolu var mı? (Belli ki, birden fazla yol olduğu gibi) Belli yöntemlerin avantajları veya dezavantajları var mı?

+0

sayesinde,. C++ 0x'nin "static_assert" aldığını gördüğüme sevindim, daha önce bunu okumayı hatırlamıyorum. ;) –

cevap

6

Boost StaticAssert'a göz atmak isteyebilirsiniz. İnternallar tam olarak temiz değiller (ya da son baktığım zamanlar değildi) ama en azından çok daha tanınabilir, bu yüzden çoğu insan ne anlama geldiğini biliyor. Ayrıca bellek hizmet verirse daha anlamlı hata iletileri üretmek için bazı ağrıları gider.

+3

Aslında ['BOOST_MPL_ASSERT_MSG'] seçeneğini tercih ediyorum (http://www.boost.org/doc/libs/1_43_0/libs/mpl/doc/refmanual/assert-msg.html). – GManNickG

10

C++ 0x'de, derleme zamanı iddiaları oluşturmak için standart bir yol sağlayan yeni bir dil özelliği, static_assert vardır. g ++ 4,3 (ve daha büyük) ve Intel C++ 11.0 gibi Örneğin, ++ 2010

static_assert(sizeof(Botan::byte) != 1, "byte type has wrong size"); 

Visual C, static_assert destekler.

0

Orada mükemmel bir #error önişlemci direktifi (bu konuda iyi bir makale için here bakınız), ama o kullanılıyor aksine bir #if içinde olması gerekir inanıyoruz bir "ayaklı" senin örneğin kullanımda olduğu gibi.

+3

'# error', bir önişleme yönergesi olduğu ve kaynağın ayrıştırılmasından önce değerlendirildiği dezavantajı vardır ve' 'if' yönergesinde' sizeof' veya makro olmayan sabitler gibi nesneleri kullanamazsınız. –

İlgili konular