Ищете дополнительные ресурсы, связанные с C++? Изучите другие записи блога из этой серии —

  1. Виртуальные функции в C++
  2. Конструкторы в C++
  3. Константные переменные в C++
  4. Ссылки на C++
  5. Параметры по умолчанию в C++
  6. Перегрузка функций в C++

Переходя от C, язык программирования C++ представил новое ключевое слово inline. Это новое ключевое слово можно использовать для квалификации функций C++, которые затем служат альтернативой параметризованным макросам языка C. В этой статье мы увидим, как создавать встроенные функции в C++ и чем они лучше параметризованных макросов C.

Макросы с параметрами

Вы можете быть знакомы с макросами, если у вас есть знания в области программирования на языке C. Определения макросов в C и C++ выполняются с использованием синтаксиса #define. Эти макросы похожи на псевдонимы и заменяются текстом до процесса компиляции препроцессором C. Вот пример использования параметризованных макросов.

#include <iostream>

using namespace std;

#define SQUARE(x) x*x

int main() {
  cout << SQUARE(5) << endl;
}

То, как мы определяем и используем макросы SQUARE, делает его похожим на функцию. Но это не то, что происходит. Под капотом препроцессор C заменит все вхождения SQUARE определением макроса. Вот как будет выглядеть наш код после обработки препроцессором C.

// Contents of <iostream> headers replaced by CPP

using namespace std;

// #define of SQUARE(x) consumed by CPP

int main() {
  cout << 5 * 5 << endl;
}

Подводные камни макросов

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

#include <iostream>

using namespace std;

#define SQUARE(x) x * x

int main() {
  int p = 3;
  cout << SQUARE(p + 1) << endl; // Incorrectly outputs 7
}

В приведенном выше примере выполнение кода приводит к выводу 7 в консоль вывода. Это связано с тем, что макросы не являются функциями и их просто заменяет CPP. Таким образом, после того, как препроцессор C (CPP) завершит свою обработку, код будет выглядеть следующим образом.

using namespace std;

int main() {
  int p = 3;
  cout << p + 1 * p + 1 << endl; // Incorrectly outputs 7
}

встроенные функции

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

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

#include <iostream>

using namespace std;

inline int SQUARE(int x) { return x * x; }

int main() {
  cout << SQUARE(5) << endl;
}

Чтобы создать встроенную функцию, мы ставим перед прототипом функции ключевое слово inline.

Преимущества встроенных функций

Есть несколько преимуществ, связанных с использованием встроенных функций. Некоторые из них -

  1. В макросах нет синтаксических или семантических ловушек.
  2. Выполняется проверка типов для параметров.
  3. Функции можно анализировать с помощью отладчика.

Нам нужно понимать, что inline — это просто директива для компилятора. Компилятор может или не может расширить функцию в месте вызова. Компилятор использует размер тела функции, чтобы решить, расширять ли ее на месте.

Другое ограничение заключается в том, что встроенные функции не могут быть рекурсивными.

Вот и все для этого обучающего пакета размером в байт для вас. Если вам нравится читать такие статьи, рассмотрите возможность подписаться на мое новостное письмо, чтобы не пропустить соответствующие статьи в будущем.