natknąłem tej definicji preprocesora podczas czytania kodu źródłowego w Windows Research Kernel (WRK) 1,2:Co robi "#define assert (exp) ((void) 0)"?
#define assert(exp) ((void) 0)
Co to kod zrobić? Dlaczego jest zdefiniowany?
natknąłem tej definicji preprocesora podczas czytania kodu źródłowego w Windows Research Kernel (WRK) 1,2:Co robi "#define assert (exp) ((void) 0)"?
#define assert(exp) ((void) 0)
Co to kod zrobić? Dlaczego jest zdefiniowany?
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.
Lub kod był w assert.h –
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).
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))
prostu ciekawi - co WRK 1.2? –
Zgaduję: Windows Research Kernel 1.2 –
Tak, to Windows Research Kernel 1.2 – Porco