Сегодня наткнулся в интернете на статью:
директива препроцессора define, где четко говорилось о том, что можно применять define, примерно как и функцию, т.е.:
#define ABCS (t) (t*t)
Получается можно сэкономить прилично кода, создавая вместо функций данные макросы define?
Здравствуйте, ertyuo, Вы писали:
E>#define ABCS (t) (t*t)
E>Получается можно сэкономить прилично кода, создавая вместо функций данные макросы define?
У дефайна ку-у-уча недостатков
P.S. Какого, по твоему мнение, именно кода можно сэкономить — машинного или программного?
Здравствуйте, 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.