Ищете дополнительные ресурсы, связанные с C++? Изучите другие записи блога из этой серии —
- Виртуальные функции в C++
- Конструкторы в C++
- Константные переменные в C++
- Ссылки на C++
- Параметры по умолчанию в C++
- Перегрузка функций в 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.
Преимущества встроенных функций
Есть несколько преимуществ, связанных с использованием встроенных функций. Некоторые из них -
- В макросах нет синтаксических или семантических ловушек.
- Выполняется проверка типов для параметров.
- Функции можно анализировать с помощью отладчика.
Нам нужно понимать, что inline — это просто директива для компилятора. Компилятор может или не может расширить функцию в месте вызова. Компилятор использует размер тела функции, чтобы решить, расширять ли ее на месте.
Другое ограничение заключается в том, что встроенные функции не могут быть рекурсивными.
Вот и все для этого обучающего пакета размером в байт для вас. Если вам нравится читать такие статьи, рассмотрите возможность подписаться на мое новостное письмо, чтобы не пропустить соответствующие статьи в будущем.