#define __NEWRES_H__
[текст модуля]
#endif //__NEWRES_H__
Если РёРјСЏ __NEWRES_H__ уже было определено РІ какой-то части программы, то повторной вставки модуля РІ текст РЅРµ последует. Такой прием используется для предотвращения многократного расширения РІ тексте программы РѕРґРЅРѕРіРѕ Рё того же модуля, РЅР° который оказалось несколько ссылок директивы #include. Также этот механизм предотвращает ситуацию, РєРѕРіРґР° РґРІР° модуля оказались взаимно включены РґСЂСѓРі РІ РґСЂСѓРіР°. Рто вполне возможно РІ сложных программах, РіРґРµ включаемые модули РІ СЃРІРѕСЋ очередь тоже содержат директивы #include.
Директива #undef удаляет объявление имени, сделанное при помощи директивы #define.
Редко используемая директива #line позволяет изменить нумерацию строк и имя файлов, выводимых макросами____ LINE__ и___ FILE__.
Директива #import предназначена для вставки в текущий файл импортированной из соответствующей библиотеки типов информации. Например, директива
#import..officeoffice.olb
вставит описание интерфейсов из файла office.olb в текущий файл.
Директива #pragma позволяет вставлять в текст модулей директивы, свойственные только данной платформе или операционной системе. У каждого компилятора для каждой операционной системы свой набор директив #pragma.
Функции
Функции main() и WinMain()
Функции в C++ являются краеугольным камнем всей концепции программирования. Собственно говоря, функции как раз и выполняют всю работу, которую запланировал для своего приложения разработчик. Само выполнение программы, написанной на С++, начинается с вызова специальной функции. Для консольных приложений это будет функция main О, для приложений Windwos – WinMainO. Модуль, в котором определена эта функция, и является основным модулем программы.
У консольного приложения со стандартным ходом выполнения программы все остальные функции вызываются из функции mainO, и когда все определенные в mainO функции вызваны, завершается выполнение основной функции, а вместе с ней завершается и выполнение программы.
У приложения Windows сценарий работы программы выглядит иначе. Управление программой осуществляется не вызовами функций из основной функции WinMainO, а выполнением обработчиков событий. Запущенное приложение работает до тех пор, пока не получит сообщение WM_QUIT, сигнализирующее о том, что приложению следует закончить работу.
Синтаксис объявления функции WinMain приведен ниже.
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,
int nShowCmd);
Параметры функции рассматриваются в следующем списке.
? hlnstance – уникальный идентификатор запускаемого экземляра приложения.
? hPrevInstance – уникальный идентификатор предыдущего запущенного экземпляра приложения. Для Pocket PC этот параметр всегда имеет значение NULL.
? lpCmdLine – строка, представляющая собой копию командной строки, при помощи которой было запущено приложение. При помощи этого параметра разработчик может обрабатывать информацию, переданную из командной строки.
? nShowCmd – целочисленная константа, определяющая, как именно основное окно приложения будет показано после запуска. Ее возможные значения перечислены в табл. 4.5.
Таблица 4.5. Параметры запуска приложения
В качестве возвращаемого значения функция WinMainO возвращает целочисленную константу, переданную ей как wParam сообщения WM_QUIT.
Объявление и реализация функций
В стандарте C++ для того, чтобы объявить и реализовать функцию, необходимо разместить как объявление функции, так и реализацию. Реализация и прототип отличаются друг от друга только наличием тела функции, другими словами, реализация – это прототип с телом функции.
Однако при компиляции приложений в eVC по умолчанию правила не так строги, и разработчик может использовать функции как с объявлением прототипа, так и без него.
Упражнение 4.7 (продолжение)
5. В файл advance.срр необходимо внести некоторые изменения. Так, в коде функции WndProc, в блоке обработки сообщения IDM_HELP_ABOUT нужно закрыть комментариями имеющийся код, и добавить одну строку.
MessageBox(hWnd, MyFunk1(), TEXT("MAMA "), 0);
Ртот РєРѕРґ выводит РЅР° экран сообщение, текст которого будет получен как возвращаемое значение функции MyFunkK).
6. Сразу после функции WndProc объявить и определить функцию MyFunkl, как показано в листинге 4.32.
Листинг 4.32
LPCTSTR MyFunk1(){
return (LPCTSTR)TEXT(В«MUMUВ»);
}
7. Запустить программу РЅР° выполнение. Вместо этого будет отображено сообщение РѕР± ошибке, указывающее, что идентификатор MyFunkl неизвестен. Рто позволяет убедиться, что несмотря РЅР° достаточную СЃРІРѕР±РѕРґСѓ объявления имени функции, это РёРјСЏ РІСЃРµ-таки должно быть объявлено раньше, чем РѕРЅРѕ будет использовано. Поэтому можно либо перенести набранный РєРѕРґ функции Рё поместить его перед WndProc, Р° можно оставить РєРѕРґ РЅР° месте Рё перед WndProc поместить только прототип функции:
LPCTSTR MyFunk1();
8. После установки прототипа перед вызовом функции MyFunkl компиляция будет проходить нормально. Проект будет запущен, и при выполнении команды меню Tools ? About на экран будет выведено сообщение MUMU.
9. Теперь нужно усложнить пример, чтобы показать, как происходит объявление и вызов функции из другого модуля. Для этого нужно добавить к проекту еще один файл исходного кода (File ? New ? Files ? C++ Source File) с именем modl.cpp. Помимо него потребуется еще один заголовочный файл (File ? New ? Files ? СС++ Header File) с именем modl.h.