Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том1)" -> 29

Visual С++ 6. Полное руководство: В 2 т.(том1) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том1) — Бином, 2006. — 569 c.
Скачать (прямая ссылка): vicualcc2006t1.djvu
Предыдущая << 1 .. 23 24 25 26 27 28 < 29 > 30 31 32 33 34 35 .. 204 >> Следующая

Определение встроенной функции (т.е. объявление, содержащее ее полный код) должно быть представлено в каждом исходном файле, в котором вызывается данная функция. Для выполнения встраивания компилятор должен иметь прямой доступ к коду функции. Чтобы в каждом модуле, содержащем вызовы встроенной функции, были доступны идентичные копии определения функции, необходимо определить функцию в файле заголовков, вызываемом каждым исходным файлом. При изменении встроенной функции все исходные файлы, содержащие ее вызовы, должны быть перекомпилированы.
Примечание
Можно настроить способ обработки встроенных функций для проекта Microsoft Visual С++, выбрав в меню Progect команду Settings... (см. гл. 2). В диалоговом окне Project Settings выберите вкладку C/C++ и выберите пункт Optimizations в списке Category Затем задайте требуемый параметр встроенной функции в списке Inline Functions Expancions. Описание различных параметров смотрите в следующих разделах справочной системы: Visual С++ Documentation, Using Visual С++, Visual С++ Programmer's Guide, Compiling and Linking, Details, Compiler Reference, I/O Options (Optimized Code), lob (Inline Function Expantion).
Замена типа функции на inline не изменяет ее смысла, но увеличивает скорость выполнения программы и размер результирующего кода. Поэтому желательно использовать спецификатор inline при определении маленькой функции, вызываемой из небольшого числа мест в коде, особенно в случае ее многократного вызова в цикле.
Механизм встраивания напоминает работу макросов, определенных с использованием директивы препроцессора #define. Например, следующая функция, предназначенная для возвращения абсолютной величины целого числа
inline int Abs (int N) {return N < 0 ? -N : N;}
подобна макросу
#define ABS (N) ( (N) < 0 ? - (N) : (N) ) ;
Но есть и отличие: вызовы встроенной функции обрабатываются компилятором, а макросов — препроцессором, выполняющим простую текстовую подстановку. Следовательно, встроенная функция имеет два важных преимущества перед макросом. Во-первых, при вызове функции компилятор проверяет тип передаваемых ей параметров, чтобы убедиться в том, что они целочисленные или их значения можно преобразовать в целочисленные. Во-вторых, если функции передается выражение, то оно вычисляется всего один раз. Если же выражение передается в макрос, то оно вычисляется дважды, что может привести к неожиданным результатам. Например, следующий вызов макроса дважды декрементирует переменную I (возможен неожиданный или нежелательный результат!):
Abs (--I) ;
Макрос также имеет преимущество перед встроенной функцией: ему можно передать данные любого типа и он возвратит результат такого же типа (например, long, int или double). Хотя во встроенную функцию также можно передать аргумент любого числового типа, тип значения будет преобразован в int, а функция возвратит значение типа int, в результате чего может быть потеряна точность. Однако, как будет показано далее (в параграфе "Перегруженные функции"), в
языке С++ эти ограничения преодолеваются путем определения нескольких вариантов функции, по одному для каждого типа или для множества типов параметров, передаваемых функции.
Примечание
Описание встроенных функций, являющихся членами классов, приведено в гл. 4.
Стандартные параметры функции
Программируя на языке С++, удобно определять при объявлении функции стандартные значения ее параметров. Стандартные значения второму и третьему параметрам задает следующее объявление:
void ShowMessage (char *Text, int Length = -1, int Color = 0);
В этой гипотетической функции значение параметра Length, равное -1, заставляет функцию вычислять длину текста, а значение параметра Color, равное 0, задает отображение текста черными буквами.
Если для некоторого параметра задано стандартное значение, необходимо определить стандартные значения для последующих параметров (т. е. для всех параметров, записанных справа от него). Нельзя объявить функцию так:
void ShowMessage (char *Text, int Length = -1, int Color); // ОШИБКА: пропущено стандартное значение для 3-го параметра
При вызове функции стандартный параметр работает следующим образом: при заданном значении фактического параметра компилятор передает это значение в функцию; при опущенном фактическом параметре компилятор передает стандартное значение параметра. При вызове функции ShowMessage можно указать один, два или три параметра.
ShowMessage ("Hello") ; // то же, что ShowMessage ("Hello", -1, 0) ; ShowMessage ("Hello", 5); // то же, что ShowMessage ("Hello", 5, 0); ShowMessage ("Hello", 5, 8);
Если параметр с заданным стандартным значением при вызове функции опущен, то необходимо опустить все параметры, находящиеся справа от него и имеющие стандартные значения. Функцию ShowMessage нельзя вызвать следующим образом:
ShowMessage ("Hello", , 8); // ОШИБКА: синтаксическая ошибка
При определении стандартных значений можно использовать выражение, содержащее глобальные переменные или вызовы функций (выражения не могут содержать локальных переменных). Допустимо такое объявление (предполагается, что код помещен вне функции):
Предыдущая << 1 .. 23 24 25 26 27 28 < 29 > 30 31 32 33 34 35 .. 204 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100