Макрос C для защиты определений - PullRequest
1 голос
/ 23 февраля 2012

Есть ли способ защитить определение макроса? Чтобы быть более конкретным, учтите следующее:

#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.

Ответы [ 2 ]

5 голосов
/ 23 февраля 2012

GCC и MSVC позволяют использовать прагму для вставки и вставки определений макросов:

 #define X  1
 #pragma push_macro("X")
 #undef X
 #define X -1
 #pragma pop_macro("X")
 int x [X];
4 голосов
/ 23 февраля 2012

Самый простой способ, чтобы макрос не повлиял на кусок кода, это поместить макрос в файл заголовка .h и НЕ включать файл заголовка в исходный файл, который компилируется.

Это означает, что вам, возможно, придется «нарезать» больший файл, чтобы получить фрагмент кода, на который макрос не должен влиять. Да, это боль, но, похоже, этого не должно быть с остальным кодом в любом случае (или это не будет проблемой).

...