2009-05-20 23 views

Odpowiedz

16

Definiuje wyrażenie asertywnie (nic nie znaczy), aby nic nie robić.

Prawdopodobnie używane środowisko nie obsługuje instrukcji ANSI C assert lub programista nie był świadomy, że można go wyłączyć, definiując NDEBUG.

+6

Lub kod był w assert.h –

8

Aby rozwinąć na co bdonlan mówi, powodem makro nie rozszerza pusty dlatego jeśli tak, to coś w rodzaju:

assert(something) // oops, missed the semi-colon 
assert(another_thing); 

będzie skompilować w trybie uwolnienia, ale nie w trybie debugowania. Powodem, dla którego jest to ((void) 0), a nie tylko 0 jest zapobieganie ostrzeżeniom "bez ostrzeżenia" (lub jakakolwiek nazwa MSVC je wywołuje).

0

Wystarczy dodać, to jest definicja assert w newlib też, gdy NDEBUG jest zdefiniowany jako dyrektywa preprocesora. Newlib jest biblioteką C o otwartym kodzie źródłowym, która jest używana w systemach Cygwin i systemach wbudowanych.

Z assert instrukcji w newlib:

Makro jest zdefiniowana pozwalają na wyłączenie wszystkich zastosowań assert na kompilacji przez zdefiniowanie NDEBUG jako zmiennej preprocesora. Jeśli to zrobisz, assert makro rozszerza się (void(0))