MBR (mbr) wrote,
MBR
mbr

Categories:

Гигиена в макросах

Читаю я вот тут людей, которые железо для обсерваторий делают и тихо охреневаю. Вот ведь простейшая же вешь. Азы можно сказать.

Пусть есть макрос:

#define F(x, y)            x * x + y

Видите проблему? Если нет, обязательно дочитайте до конца.

Берем такую реализацию:

F(a, b) -> a * a + b

Вроде как все замечательно и будет работать. Проект закрыт. А через год делаем небольшую правку

F(a + c, b) -> a + c * a + c + b

И в этом моменте мы начинаем хвататься за голову и думать что-же такое случилось. А случился попросту говнокод. Чтобы так не было достаточно небольшого изменения:

#define F(x, y)            (x) * (x) + (y)

Окей, а потом мы делаем еще одну правку:

F(a + c, b) * d -> (a + c) * (a + c) + (b) * d

И опять хватаемся за голову. Потому, что мы забыли еще в одном месте себя обезопасить

#define F(x, y)            ((x) * (x) + (y))

Используя макросы - всегда - просто заведите себе за правило - всегда оборачивайте аргументы и всю функцию. Простая гигиена сэкономит тучу времени на отладку странного поведения.
Tags: it
Subscribe

  • Новое прочтение классики

    Искал письмо в спаме. Аж прослезился.

  • фронтэнд

    А где нынче модно искать фрилансеров на фронтенд? Задача разовая, фрилансерские сайты что-то молчат. Или не там ищу?

  • Сбер

    #BREAKING Sberbank, a Russian state-owned bank has been breached. Data will be uploaded soon. Data included is DNS infrastructure, private keys for…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 19 comments

  • Новое прочтение классики

    Искал письмо в спаме. Аж прослезился.

  • фронтэнд

    А где нынче модно искать фрилансеров на фронтенд? Задача разовая, фрилансерские сайты что-то молчат. Или не там ищу?

  • Сбер

    #BREAKING Sberbank, a Russian state-owned bank has been breached. Data will be uploaded soon. Data included is DNS infrastructure, private keys for…