trinitr0
@trinitr0
провинциальный админ

Почему #define не рекомендуетс к использованию?

В книге Скотта Майерса "Эффективное использование C++" приводится пример плохого применения директивы #define:
#define max(a,b) ((a) > (b) ? (a) : (b))
И далее к чему это может привести:
int a = 5, b= 0
max(++a, b);          // a увеличится дважды
max(++a, b+10);    // a увеличится один раз

1. Почему а увеличится в коде дважды?
2. Почему аргументы в директиве заключены в скобки?
  • Вопрос задан
  • 677 просмотров
Решения вопроса 1
BacCM
@BacCM
C++ почти с рождения
Потому, что
1. нет контроля типов
2. нет ограничения по области видимости, типа неймспейсов.
3. макрос разворачивается подстановкой в месте использования, т.е. там будет вставлен код
((a) > (b) ? (a) : (b)) который превратится в ((++a) > (b+10) ? (++a) : (b+10))
4. макросы сложно отлаживать
5. неправильно написанный макрос будет компилироваться в непонятно что. Например если убрать те же скобки

как без них раскроется выражение x = max(a, b) + 10; ?
x = a > b ? a : b+10;

для max скорее всего параметры не имеет смысла оборачивать в скобки, достаточно общих, хотя наверное можно что-то придумать чтобы сломалось без них. Просто так принято, из за того что макросы могут оказаться внутри выражения и как там раскроются их нетривиальные параметры не понятно.
например

#include <iostream>

#define mymax(a,b) a>b?a:b
#define mul(a,b) a*b

int main() 
{

	std::cout << mymax(5, 10) << std::endl; // Ошибка компиляции
	std::cout << mul(5+5, 10) << std::endl; // Неожиданно на выходе 55, а не 100

	return 0;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы