Ce face assert
assert(conditie) este un macro pentru verificări interne: lucruri care, dacă programul este corect, sunt mereu adevărate (un pointer nu e nul, un index e în limite). Dacă condiția este adevărată, nu se întâmplă nimic. Dacă este falsă, se afișează pe stderr condiția, fișierul și linia, apoi programul se oprește cu std::abort.
Când programul este compilat cu -DNDEBUG (de obicei la versiunea finală, „release”), toate assert-urile dispar complet din cod. De aceea nu pune în assert cod care trebuie să ruleze (de exemplu assert(salveaza())) și nu îl folosi pentru erori care pot apărea la utilizatori (date greșite, fișiere lipsă); pentru acestea folosește excepții.
Truc: assert(conditie && "mesaj") face ca mesajul să apară în textul afișat la eșec. Pentru verificări la compilare există static_assert.
Parametri
| Parametru | Descriere |
|---|---|
conditie |
Expresia care trebuie să fie adevărată. |
Ce returnează
Nimic. Dacă condiția este falsă, programul se oprește.
Exemple
Exemplul 1: Un assert care trece
Toate condițiile sunt adevărate, deci programul rulează normal.
#include <cassert>
#include <print>
#include <vector>
double medie(const std::vector<int>& note) {
assert(!note.empty() && "media cere cel puțin o notă");
int suma = 0;
for (int n : note) {
assert(n >= 1 && n <= 10);
suma += n;
}
return static_cast<double>(suma) / static_cast<double>(note.size());
}
int main() {
std::println("Media: {}", medie({9, 10, 8}));
}
Rezultat
Media: 9
Exemplul 2: Un assert care eșuează
Nota 12 încalcă condiția, iar programul se oprește înainte de ultima linie. Textul de mai jos este cel afișat pe macOS (pe alte sisteme formatul diferă puțin); codul de ieșire este 134 (SIGABRT). Compilat cu -DNDEBUG, programul ar afișa ambele linii, fără nicio verificare.
#include <cassert>
#include <print>
int main() {
int nota = 12;
std::println("Verific nota {}", nota);
assert(nota >= 1 && nota <= 10);
std::println("Nota este validă");
}
Rezultat (programul se oprește cu eroare)
Verific nota 12
Assertion failed: (nota >= 1 && nota <= 10), function main, file exemplu.cpp, line 7.
Greșeli frecvente
- Pui în
asserto acțiune:assert(fisier.open("date.txt")). Cu-DNDEBUG, linia dispare și fișierul nu se mai deschide deloc. - Folosești
assertpentru validarea datelor introduse de utilizator. În versiunea finală verificarea nu mai există; foloseșteifși excepții.
Comenzi înrudite
static_assert: Verifică o condiție la compilare; dacă este falsă, compilarea se oprește cu mesajul dat.std::terminate: Oprește imediat programul; este apelată automat când o excepție nu este prinsă nicăieri.std::logic_error: Excepție pentru greșeli de logică ce puteau fi evitate prin cod corect; domain_error: valoare în afara domeniului.std::unreachable: Îi spune compilatorului că un punct din cod nu poate fi atins niciodată, ca să optimizeze.