Одинаково ли ведут себя #define и inline?
Нет, они не делают!
Существует ряд различий между макросом и встроенной функцией.
- Нет оценок времени
Выражения, передаваемые в качестве аргументов встроенным функциям, вычисляются один раз.
В некоторых случаях выражения, передаваемые в качестве аргументов макросам, могут оцениваться более одного раза.
Каждый раз, когда вы используете аргумент в макросе, этот аргумент оценивается.
A Пример кода:
#define max(a,b) (a>b?a:b)
int main()
{
int a = 0;
int b = 1;
int c = max(a++, b++);
cout << a << endl << b << endl;
return 0;
}
Вероятно, предполагалось напечатать 1 и 2, но макрос расширился до:
int c = a++ > b++ ? a++ : b++;
b увеличивается в два раза, и программа печатает 1 и 3.
- Кто их оценивает
Встроенные функции оцениваются компилятором, а макросы оцениваются при предварительной компиляции прекомпилятором.
- Проверка типа
Встроенные функции следуют всем протоколам безопасности типов, применяемым в обычных функциях.
Типы аргументов проверяются, и необходимые преобразования выполняются правильно.
Компилятор выполняет проверку типа возвращаемого значения и сигнатуры функции перед помещением встроенной функции в таблицу символов.
Они могут быть перегружены для выполнения правильных операций с нужными данными.
Макросы более подвержены ошибкам по сравнению со встроенными функциями. Параметры не являются типизированными (макрос работает для любых объектов арифметического типа).
Во время компиляции проверка ошибок не производится.
Пример кода:
#define MAX(a, b) ((a < b) ? b : a)
int main( void)
{
cout << "Maximum of 10 and 20 is " << MAX("20", "10") << endl;
return 0;
}
Можно передать строки в макрос, который выполняет целочисленную арифметику, и макрос не будет жаловаться!
- Предложение или команда?
Inline - это всего лишь предложение для компилятора. Компилятор решает, расширять функцию или нет.
Макросы всегда будут расширяться.
- Как насчет отладки?
Встроенные функции можно легко отлаживать, поскольку вы можете поставить точку останова в определении встроенной функции и шаг за шагом перейти к методу отладки.
Макросы нельзя использовать для отладки, поскольку они раскрываются во время предварительной компиляции.