2010-08-14 36 views
5

ho recentemente venuto sulla necessità di avere asserzioni a tempo di compilazione in C++ per verificare che le dimensioni di due tipi erano uguali.Asserzioni in fase di compilazione in C++?

ho trovato la seguente macro sul web (dichiarato di essere venuto dal kernel Linux):

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

che ho usato in questo modo:

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

Questo mi fa strano - anche se questo funziona, c'è un modo più pulito per farlo? (Ovviamente c'è più di un modo, com'è) Ci sono vantaggi o svantaggi di certi metodi?

+0

Grazie per tutte le risposte a tutti, molto interessante. Sono felice di vedere che il C++ 0x sta ottenendo 'static_assert', non ricordo di averlo letto prima. ;) –

risposta

6

Si potrebbe voler dare un'occhiata a Boost StaticAssert. Gli interni non sono esattamente puliti (o non erano l'ultima volta che ho guardato), ma almeno è molto più riconoscibile, quindi molte persone sanno cosa significa. Inoltre, se la memoria serve, produce anche messaggi di errore più significativi.

+3

In realtà preferisco ['BOOST_MPL_ASSERT_MSG'] (http://www.boost.org/doc/libs/1_43_0/libs/mpl/doc/refmanual/assert-msg.html). – GManNickG

10

In C++ 0x, è disponibile una nuova funzione di lingua, static_assert, che fornisce un metodo standard per generare asserzioni in fase di compilazione. Ad esempio,

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

Visual C++ 2010 supporta static_assert, così come g ++ 4.3 (e versioni successive) e Intel C++ 11.0.

0

C'è un ottimo #error direttiva del preprocessore (vedi here per un buon saggio su di esso), ma credo che deve essere all'interno di un #if invece di essere utilizzato in un "free-standing", come nel vostro uso esempio.

+3

'# error' ha lo svantaggio di essere una direttiva di pre-elaborazione e viene valutata prima che l'origine sia analizzata, e non è possibile usare cose come' sizeof' o costanti non-macro nella direttiva di controllo # # se'. –

1

Alcune altre opzioni interessanti sono qui: http://www.jaggersoft.com/pubs/CVu11_3.html

lettura Neat come l'autore cammina la C (non C++) spec alla ricerca di sintassi che può essere sfruttato come affermazioni in fase di compilazione.

Problemi correlati