Day 13.
Если вам
#define нужен «на время», вы можете потом раздефайнить:
#define X
X
X
...
X
#undef X
X // ⛔️CE
Фактически это замена области видимости для макросов.
Один из примеров (я не говорю, что хороших, мы тут вообще про макросы говорим, что с ними хорошего?) — получить доступ к членам объектов для тестирования:
// in test.c
#define private public
#include "logic_with_A_class.h"
// in some test
A a = getA();
assert(a.x == 1);
#undef private
После
#define в вашем инклуде все приватные поля в A станут публичными, что даёт нам возможность к ним обратиться (к полю x в примере). Аналогично вы можете подменить все вызовы функции в подключённом хедере на вашу функцию.
#define malloc my_malloc
#include "code.h"
#undef malloc
Конечно, можно сломать что-нибудь:
#undef assert
#undef errno
@thisnotes. Patreon, Boosty.
Спасибо Artyom Garkavy и niki4smirn.