А почему функция, а не define
От: ertyuo  
Дата: 05.01.10 23:37
Оценка:
Сегодня наткнулся в интернете на статью: директива препроцессора define, где четко говорилось о том, что можно применять define, примерно как и функцию, т.е.:
#define ABCS (t) (t*t)
Получается можно сэкономить прилично кода, создавая вместо функций данные макросы define?
Re: А почему функция, а не define
От: 0x7be СССР  
Дата: 05.01.10 23:45
Оценка:
Здравствуйте, ertyuo, Вы писали:

E>#define ABCS (t) (t*t)

E>Получается можно сэкономить прилично кода, создавая вместо функций данные макросы define?

У дефайна ку-у-уча недостатков

P.S. Какого, по твоему мнение, именно кода можно сэкономить — машинного или программного?
Re: ой. мама. тролль++
От: ononim  
Дата: 05.01.10 23:56
Оценка: 2 (1)
Как много веселых ребят, и все делают велосипед...
Re: А почему функция, а не define
От: rg45 СССР  
Дата: 06.01.10 00:49
Оценка: 31 (1)
Здравствуйте, ertyuo, Вы писали:

E>Сегодня наткнулся в интернете на статью: директива препроцессора define, где четко говорилось о том, что можно применять define, примерно как и функцию, т.е.:

E>#define ABCS (t) (t*t)
E>Получается можно сэкономить прилично кода, создавая вместо функций данные макросы define?

Потрясная идея! Давай же скорее использовать! Используем:
  std::cout << ABCS(3-2) << std::endl;

Упс! Что за ерунда. Наша программа почему-то вывела -5 вместо ожидаемой единицы. Ах, ну да, в макросе маловато скобок. Исправляем:
#define ABCS(t) ((t)*(t))

И опять используем:
  int x = 1;
  std::cout << ABCS(++x) << std::endl;

Что за фигня??? Почему на одном компиляторе выводится, как и ожидалось 4, а на другом 9??? Может, потому, что наш макрос порождает неопределенное поведение?

Оказывается, обнаруженные нами спецэффекты давно уже открыты и называются макроопределениями с побочными эффектами. И это только лишь малая часть неприятностей, с которыми можно столкнуться, используя макросы вместо функций. Как уже совершенно справедливо заметили, у макросов ку-у-уча недостатков. И эти недостатки достаточно подробно описаны в литературе, имеет смысл ознакомиться. Для начала можно почитать здесь
Автор(ы): Герб Саттер, Андрей Александреску

Эта книга поможет новичку стать профессионалом, так как в ней
представлен сконцентрированный лучший опыт программистов на C++,
обобщенный двумя экспертами мирового класса. Начинающий программист
найдет в ней простые и понятные рекомендации для ежедневного
использования, подкрепленные примерами их конкретного применения
на практике.
, параграф 16.
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.