Использование макроса assert в Си и C++

Есть такая интересная штука в стандартной библиотеке Си, как макрос assert. Что же он делает? Зачем нужен? Как работает? Прошу под кат.

Макрос проверяет переданное ему выражение на истинность(то есть true или false). Если выражение true — программа выполняется дальше, если false — программа аварийно завершается(подробнее далее). Давайте напишем пример, который проиллюстрирует работу макроса:

#include <assert.h> //подключаем заголовочный файл для assert
#include <stdio.h>

int main(int argc, char *argv[])
{
	printf("Выполнение assert(true)rn"); //выводим на экран строку
	assert(0 == 0); //передаем в assert TRUE
	printf("Выполнение assert(false)rn"); //выводим на экран строку
	assert(0 == 1); //передаем в assert FALSE
	/*Пытаемся вывести еще одну строку, но этот код не будет выполнен
	так как предыдущий assert завершил выполнение программы*/
	printf("Завершение программыrn");
	return 0;
}

В результате программа выдаст следующее:

После первого выполнения выражение переданное макросу равнялось true, поэтому программа продолжила свою работу. Второй вызов assert получил в качестве результата выражения false. В этот момент, в стандартный поток ошибок(stderr) была записана информация о вызове, и вызвана функция abort().

Использовать на практике макрос приходится редко, но все же применение найти можно. Например у вас есть программа, которая запускается каким либо образом автоматически, открывает какой-то файл, и записывает в него данные. Если эту программу контролировать не нужно, то можно применить в качестве проверки наличия файла макрос:

#include <assert.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
	FILE* pFile;
	pFile = fopen("input.txt", "r");
	assert(pFile);
	return 0;
}

Программа попытается открыть файл. Если не получиться, она завершится. В принципе можно пойти более простым и привычным путем:

#include <stdio.h>

int main(int argc, char *argv[])
{
	FILE* pFile;
	pFile = fopen("input.txt", "r");
	if (!pFile)
		printf("File not found!rn");
	else
		printf("File found!rn");
}

Но в реальных проектах завершение работы программы при неверных аргументах ничем не отличиться от того же зависания. Поэтому макрос следует использовать только в личных целях. То есть для отладки. К примеру вы пишите программу, по логике она должена работать, но при запуске наблюдается ошибка сегментации. Просто вставьте макрос assert в наиболее опасные места, что бы проверить значения переменных, возвращаемые значения функциями и т.д.. Таким образом вы сможите найти ошибку в коде

Спрашивайте свои ответы, пишите пожелания.

Комментарии 4

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *