Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC++(теория).doc
Скачиваний:
6
Добавлен:
01.04.2025
Размер:
375 Кб
Скачать
☆

Взаимодействие с ассемблером

  • С помощью инструкции _asm можно объявить оператор или блок операторов на языке ассемблера, которые напрямую транслируются в машинные коды (\24ASM.CPP)

int main()

{

long l = 0; // Объявление переменной

cout << "l = " << l << endl;

_asm { // Блок ассемблерных команд

mov l, eax // Присвоение переменной значения регистра eax

}

cout << "l = " << l << endl; // Вывод нового значения переменной

return(0);

}

Обработка ошибок и исключений

  • Стандартный механизм обработки ошибок предполагает анализ ошибки в теле программы после вызова функции путем проверки возвращаемого ей значения. Это достаточно просто, наглядно, но создает проблемы при написании сложных программ, в которых присутствует множество вложенных функций (сложно отследить логику, какую часть операторов надо выполнять, а какую – нет при возникновении ошибки). Пример подобной обработки:

FILE *stream;

if ((stream = fopen( "data", "r" ))==NULL) // Если NULL–файл не открыт

cout << "File wasn't opened: " << strerror(errno); // Логика обработки

  • Механизм исключений, введенный в С++ позволяет упростить обработку ошибок. Программист определяет условие возникновения ошибки и создает (выбрасывает) исключение. При возникновении исключения нормальный ход программы прерывается и система ищет обработчик исключения данного типа или обработчик всех исключений. После его выполнения программа продолжает выполнение со следующего за обработчиком исключения оператора.(\25EXCEP)

int testfunc(int j, int i) // Тестовая функция

{

if (i == 0) // Определение условий для исключения

throw "Can be divizion by zero"; // создание исключения

return (j / i); // Нормальный ход программы

}

int main()

{

try { // Тело защищаемого блока

cout << "1 test : " << testfunc(1, 1) << endl;

cout << "2 test : " << testfunc(1, 0) << endl; // Здесь появится исключение

cout << "3 test : " << testfunc(0, 1) << endl;

}

catch (char* psz) { // Перехват исключения типа *char

cout << psz; // Логика обработки исключения: вывод сообщения

}

catch (...) { // Перехват исключения любого типа

cout << "Catched Any Exception"; // Логика обработки ...

}

return 0;

}

Директивы препроцессора: Макросы и Условные директивы

  • Директива #define , кроме определения констант, может задавать макросы, то есть препроцессор (работающий перед компилятором) заменит вхождение одних символов в программе на другие, например (\26PREPR)

#define SQUARE(x) x*x // Определение макроса для вычисления квадрата

…

int iresult = SQUARE(5); // Использование макроса, результат: iresult = 5*5;

  • Пользоваться этим нужно осторожно, использование этого макроса не всегда приводит к желаемому резуьтату:

int iresult = SQUARE( x+1 ); // Результат не (x+1)*(x+1), а x+1*x+1

  • В макросах можно использовать не только переменные, но и вызов различных функций…

#define PRINTLN(x) cout<<(x)<<endl // Макрос выводящий переменную на консоль

…

PRINTLN(iresult); // Использование макроса вывода на консоль

Условные директивы позволяют задавать компилятору правила, при

которых тот будет компилировать различные участки кода, например, задавать разный типа для переменной:

#define SHORTVAR // Определение условной директивы для препроцессора

…

#ifdef SHORTVAR // Проверка определения директивы

short i = SQUARE(5); // Компиляция одних операторов, если директива определена

#else

long i = SQUARE(1000); // Компиляция других операторов, если нет

#endif

PRINTLN(i); // Использование макроса вывода на консоль

  • Для работы с условиями используются директивы: #define #ifdef #else #elif #endif #undef #ifndef

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]