Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все лекции С++.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
562.69 Кб
Скачать

Типичное применение препроцессорных директив Предотвращение включения файлов

Иногда при использовании заголовков может происходить дублирование кода из-за повторного включения некоторого файла. (Допустим, у вас имеется исходный файл myprog.c, который подключает директивой # include два заголовка headerl.h и header2.h. Если, в свою очередь, оба этих файла подключают некоторый headerO.h, то последний будет дважды включен в исходный файл myprog.c. Это ни к чему, хотя обычно и не приводит к ошибке.)

Чтобы предотвратить повторное включение кода заголовочного файла, можно организовать контроль следующим образом (как говорят, “поставить часового”):

/* header0.h: Заголовочный файл, который может оказаться многократно включенным*/

#ifndef _HEADERO_H

#define _HEADERO_H

/* Здесь идут макросы, определения типов и т.д. вашего заголовочного файла*/

*endif

Переключение разделов кода

Директивы условной компиляции могут использоваться для простого переключения между двумя различными вариантами кода — старым и экспериментальным алгоритмом, например. Это можно сделать так:

/*Измените определение на 0, чтобы вернуться к старому варианту.*/

*define NEW_VER I

#if NEW_VER /* Экспериментальный код.*/

#else /* Старый код.*/

*endif

Или, если не вводить дополнительный идентификатор:

/*Измените на 1, когда новый код будет отлажен.*/

*if 0 /* Экспериментальный код.*/

#else /* Старый код.*/

*endif

Отладочные диагностические сообщения

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

#define INFO(msg)

printf(#msg "\n")

#define DIAG(msg)

printf("File " _FILE_ " Line %d: " \ #msg "\n", _LINE_)

void SomeFunc(void)

{

INFO(Entering SomeFunc.); /* Выводит информационное сообщение. */

if (someError)

DIAG(Error encountered!); /* Выводит сообщение об ошибке. */

INFO(Exiting SomeFunc...) ;

}

Лекция 12 Тема: Состав проекта.

Программные задачи в Visual C++ оформляются в виде проектов, т.е. представляют собой набор файлов, которые совместно используются для создания одной программы.

Проекты размещаются в рабочих областях, причем одна область может содержать несколько проектов.

При создании новой рабочей области с именем New в ней автоматически создаются:

  • New.dsw – основной файл рабочей области (определяет параметры новой области);

  • New.dsp –файл проекта (определят параметры проекта);

  • New.h – заголовочный файл приложения;

  • New.срр – исходный текст приложения;

  • StdAfx.h – заголовочный файл для стандартного каркаса приложения;

  • StdAfx.cpp – исходный текст стандартного каркаса приложения;

  • MainFrm.h – заголовочный файл главного окна;

  • MainFrm.cpp – исходный текст главного окна;

  • NewDoc.h – заголовочный файл документа;

  • NewDoc.cpp – исходный текст документа;

  • NewView.h – заголовочный файл вида;

  • NewView.cpp – исходный текст вида;

  • Resource.h – файл с ресурсными константами;

  • New.rc – файл с ресурсами;

  • New.ncb – файл с информацией о представлении и взаимных связях;

  • Res – каталог для ресурсов.

Программа, созданная на Visual C++ AppWizard, состоит из четырех основных частей:

  1. объекта приложения;

  2. объекта главного окна;

  3. объекта документа ;

  4. объекта вида.

Объект приложения, находящийся в файлах New.h (содержит определения констант, объявления переменных и методов класса) и New.срр, - это то, что Windows запускает при старте программы. Когда этот объект начинает работу, он запускает программу, создает и размещает на экране главное окно и организовывает передачу сообщений Windows в главное окно и из него. Сообщения – это сигналы, с помощью которых разные объекты в среде Windows общаются между собой. Например, когда пользователь завершает работу программы, Windows посылает объекту приложения сообщение WM_QUIT. Если пользователь изменяет размеры окна – сообщение WM_SIZE. Большинство полученных сообщений объект приложение отсылает объекту главного окна.

Объект главного окна отображает на экране саму программу. В нем находится меню, заголовок окна, панель инструментов и строка состояния. Причем меню и заголовок окна создаются автоматически, а панель инструментов и строка состояния добавляются в методе Create (хотя основная часть программного кода для них сосредоточена в объекте вида). Здесь пишутся различные методы, предназначенные для обработки конкретных сообщений Windows.

Например, метод OnDraw вызывается при необходимости перерисовать клиентскую область окна. В этом методе можно использовать класс CDC – класс для работы с контекстными устройствами. Графический вывод может выполняться как на экран, так и на принтер. Например метод TextOut позволяет отобразить на поверхности главного окна текстовое сообщение.

Объект вида предназначен для работы с клиентской областью, т.е. рабочей зоной программы. (Объект вида – это окно, которое накладывается поверх клиентской области). Программы для Windows управляются событиями, т.е. реагируют на действия пользователя. Так метод OnDraw вызывается, когда необходимо перерисовать клиентскую область. В этом методе можно вывести текстовое сообщение прямо в объекте вида.

PDC->TextOut(0,0,”Hello”);

Переменная PDC принадлежит классу CDC. Это класс для работы с контекстными устройствами. Графический вывод может выполняться как на экран, так и на принтер. Все рисование будет выполняться через контекст устройств.

Объект документа – хранит данные программы, которые отображаются и в клиентской, и в неклиентской области. Объект вида потом отображает только те данные, которые попадают в клиентскую область. Так для вывода текстового сообщения с помощью текстовой переменной, описание этой переменной следует разместить именно в объекте документа, а точнее в заголовочном файле объекта документа (где расположено объявление класса объекта документа). Инициализация такой переменной может находиться в конструкторе класса документа.

При генерации кода AppWizard автоматически создает указатель на объект документа с помощью метода GetDocument() класса вида.

CExampleDoc* pDoc=GetDocument(); //Example – название рабочей области

ASSERT_VALID(pDoc); // проверка на правильность создания указателя.