C++ Программирование в среде С++ Builder 5



Расширяемые функции - часть 2


Привлекая самые общие соображения, можно сформулировать следующее правило: для того, чтобы вызов iniine-функций замещался ее расширением, компилятор должен видеть определение функции в точке ее вызова. Если он ее не видит, то рассматривает функцию как внешнюю, т. е. определенную ниже или вообще в другом файле. Современные компиляторы по большей части однопроходные. Термин не имеет отношения к животному миру Австралии, а означает, что компилятор сканирует текст транслируемого модуля единственный раз и не может “заглянуть вперед”.

Компилятор Borland C++ не может расширять встроенные функции также в следующих случаях:

  • Если функция содержит операторы цикла или оператор выбора switch.
  • Если функция имеет тип не void и не содержит при этом оператора return.
  • Если она содержит встроенный код ассемблера.
  • В качестве иллюстрации рассмотрите такой пример:

    /////////////////////////////////////////////////

    // Inline.срр: Расширение inline-функций.

    //

    #pragma hdrstop

    #include <condefs.h>

    #include <stdio.h>

    inline int Max(int, int);

    int МахЗ(int, int, int);

    int main(void) {

    int x = 11, у = 22, z = 33, v = 44;

    x = МахЗ(х, z, v) ;

    z = Мах(х, у);

    // Не расширяется - генерируется вызов!

    printf("Max(%d, %d) = %d.\n", х, у, z);

    return 0;

    }

    inline int Max(int a, int b) {

    return a > b? a : b;

    }

    int МахЗ (int a, int b, int c)

    {

    b = Max(a, b);

    // Эти вызовы расширяются как встроенные.

    return Max(с, b) ;

    }

    Здесь функция Мах () определяется после main (), поэтому ее вызов из main () не расширяется как встроенный. Однако после определения Мах () дальнейшие ее вызовы (в Мах3 ()) уже расширяются. Воспользуйтесь отладчиком, чтобы это проверить — внутрь встроенной функции нельзя войти командой Trace Into; ее можно отлаживать только в окне CPU.

    Лучше всего размещать определения расширяемых функций в заголовочных файлах (для обычной, определенной где-то вовне функции файл включал бы ее прототип).




    Содержание  Назад  Вперед