Есть ли способ защитить определение макроса? Чтобы быть более конкретным, учтите следующее:
#define macro1 x
// code segment 1 involving macro1 goes here
// code segment 2 involving macro1 goes here
// code segment 3 involving macro1 goes here
В примере я разместил 3 комментария, обозначающих сегменты кода, включающие макрос. Теперь я хотел бы избежать влияния макроса на сегмент кода 2. Есть ли способ сказать компилятору заменить все экземпляры macro1 в сегменте 1 и сегменте 3, но не в сегменте 2? Вот возможный путь:
#define macro1 x
// code segment 1 involving macro1 goes here
#undef macro1
// code segment 2 involving macro1 goes here
#define macro1 x
// code segment 3 involving macro1 goes here
Недостаток в том, что мне нужно снова определить макрос. Скажи, что я хотел использовать слово
NULL в моей программе (не спрашивайте меня, почему просто пойти с этим). Я хочу, чтобы это было переменной
но препроцессор C в большинстве случаев изменит его на 0. Так что я хочу сделать, это быть
возможность заблокировать его на короткий промежуток времени, а затем позволить ему быть тем, что было раньше.
Неудачная попытка:
Предположим, что macro1 был определен где-то извне, и мы даже не знаем, каково значение такого макроса. Все, чего мы хотим, - это не заменять вещи во втором сегменте.
// code segment 1 involving macro1 goes here
#ifdef macro1
#define TEMP macro1
#undef macro1
#endif
// code segment 2 involving macro1 goes here
#ifdef TEMP
#define macro1 TEMP
#undef TEMP
#endif
// code segment 3 involving macro1 goes here
Идея состоит в том, чтобы проверить, существует ли макрос, если он существует, тогда мы хотим сохранить значение в другой переменной, отменить определение макроса и, наконец, определить макрос снова, когда нам это нужно.
К сожалению, этот код не работает, потому что перед выполнением сегмента кода 3 макрос1 будет заменен на TEMP, а не на значение, которое должен был иметь TEMP.