92 ___ _________Часть II. Программирование на C++
Функцию assert легко можно задать в виде макроопределения, принимающего аргумент и просто возвращающую управление в случае ненулевого аргумента, а в случае нуля печатающую простенькое сообщение, номер строки, имя файла и завершающую выполнение программы.
И такая функция уже создана. Чтобы использовать макрос assert, включите в свой модуль заголовок assert.h и вызовите assert, передав ему целочисленный аргумент. Например,
assert(1);
выдерживает проверку на истинность, а
assert; 5==2);
нет, потому что утверждение 5==2 ложно.
Зачем это нужно? Макрос assert используется для инвариантного тестирования, другими словами, он предназначен для отладочных целей. Утверждения используются там, где встречаются определенные условия, критерии или граничные значения. Такого рода вещи называются инвариантами (invariants).
Одним из методов отладки, который можно применять при создании программного обеспечения — это использовать assert везде, где для корректного выполнения программы должны соблюдаться некоторые определенные минимальные условия; assert в самой категоричной манере поставит вас в известность, когда эти условия будут нарушены.
Предположим, например, что у нас есть простой массив типа:
const int MAX = 10;
int a[MAX] ;
При любом обращении к массиву вы можете утверждать (assert), что индекс не вышел за границы массива. Например:
assert( j>=0 && j<MAX) ;
a[j] = 5;
В этом примере можно не беспокоиться, что произойдет обращение к элементу массива с неправильным индексом. Увы, настоящие программы редко столь просты.
Эта функция ни в коем случае не заменяет собой контроль условий при выполнении программы, то есть при использовании, например, того же массива следует проверять границы'индексов компилируемым кодом. Тогда фрагмент примет вид:
assert) j>=0 && j<MAX) ;
if( j>=0 && j<MAX)
a[j] = 5; // обращение к a[j]