W języku C++ funkcja/makro
Przyklad użycia:
Jeśli wewnątrz predykatu umieścimy jakąkolwiek operację przypisującą wartość, dokonującą modyfikacji zmiennych otrzymamy błąd którego odnalezienie może nas kosztować sporo czasu. Poniżej przedstawiono przykłady
W pierwszych dwóch przypadkach zamiast zastosowania operatora porównania == umieszczono operator przypisania =. Jest to najczęściej spotykany błąd wewnątrz predykatu funkcji assert.
Kolejnym często spotykanym błędem jest umieszczenie wewnątrz predykatu wywołania funkcji modyfikującej stan programu. np:
Tak przygotowany kod będzie inaczej funkcjonować w wersji testowej (debug) a inaczej w wersji produkcyjnej (release).
Wywołujące funkcję:
Czyli odpowiedź na pytanie czy assert to makro czy funkcja brzmi: W przypadku kompilatora Microsoft, assert to makrodefinicja zachowująca się jak funkcja wywołująca funkcję _wassert.
xsi-blog.com
wikibooks
pornel
assert() jest częścią biblioteki C. Funkcja umożliwia wywołanie programu uruchamiającego (debugger) w przypadku kiedy pewien warunek którego się nie spodziewamy nastąpi. Dodatkowo, funkcja ta jest wywoływana tylko w przypadku kiedy program jest skompilowany w trybie uruchomieniowym (wersja debugowa). W przypadku produkcyjnych plików wynikowych (wersja Release lub Ship binary) funkcja assert() jest zastępowana pustą instrukcją.
Przyklad użycia:
#include "assert.h"
int main()
{
int err=1;
assert(err==0);
return 0;
}
Jak nie używać assert
Jeśli wewnątrz predykatu umieścimy jakąkolwiek operację przypisującą wartość, dokonującą modyfikacji zmiennych otrzymamy błąd którego odnalezienie może nas kosztować sporo czasu. Poniżej przedstawiono przykłady
assert(a = b+1);
assert(a = d);
assert(a++);
W pierwszych dwóch przypadkach zamiast zastosowania operatora porównania == umieszczono operator przypisania =. Jest to najczęściej spotykany błąd wewnątrz predykatu funkcji assert.
Kolejnym często spotykanym błędem jest umieszczenie wewnątrz predykatu wywołania funkcji modyfikującej stan programu. np:
assert(fopen("plik","r"))
Tak przygotowany kod będzie inaczej funkcjonować w wersji testowej (debug) a inaczej w wersji produkcyjnej (release).
Makro czy funkcja?
Czasem w literaturze można znaleźć informację że assert to funkcja, w innych przypadkach puryści zarzekają się że to makro. W przypadku kompilatora Microsoft C++, assert zdefiniowano jako makro:
#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
Wywołujące funkcję:
_CRTIMP void __cdecl _wassert( ...
Czyli odpowiedź na pytanie czy assert to makro czy funkcja brzmi: W przypadku kompilatora Microsoft, assert to makrodefinicja zachowująca się jak funkcja wywołująca funkcję _wassert.
Literatura
xsi-blog.com
wikibooks
pornel
