Нужно ли отменять макросы внутри функции? - PullRequest
4 голосов
/ 09 августа 2011

Я много раз видел такой код:

void func(){
  #define a ...
  ...
  #undef a
}

Нужен ли вообще #undef?

Ответы [ 4 ]

11 голосов
/ 09 августа 2011

Это необязательно, но область действия #define является глобальной после строки, в которой она была определена.Он не будет подчиняться области действия функции, если вы думаете, что это будет.

3 голосов
/ 09 августа 2011

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

Большинство макросов, вероятно, в любом случае должны быть видимы в исходном файле, поэтому обычно возникает вопросне возникает.

1 голос
/ 09 августа 2011

Когда я объявляю макрос, как вы делали в теле функции, я бы в конце #undef. Потому что, скорее всего, он предназначен только для этого тела функции.

Как правило, #undef - это всегда хорошая идея, если вы знаете, что определение макроса не будет использоваться в любое время позже, поскольку определение макроса распространяется на все другие файлы, которые включают файл, содержащий макрос.

1 голос
/ 09 августа 2011

Это зависит.Это необходимо, только если вы хотите убедиться, что a не будет потенциально доступен в более поздние моменты вашей программы в зависимости от вашей логики.define теперь является глобальным (в текущей единице перевода)!

From gnu.org :

Если макрос перестает быть полезным, онможет быть неопределено с помощью директивы `#undef '.

Кроме того,

Если макрос не определен, этот идентификатор может быть переопределен как макрос с помощью последующего`директива #define.Новое определение не должно иметь никакого сходства со старым определением.

и

Однако, если идентификатор, который в настоящее время является макросом, переопределен, то новое определение должнобыть фактически таким же, как старый.Два определения макросов фактически одинаковы, если:

  • Оба типа макросов одинаковы (объектно-подобны).
  • Все токены списка замены одинаковы.
  • Если есть какие-либо параметры, они совпадают.
  • Пробелы появляются в одних и тех же местах в обоих.Это не должно быть точно такое же количество пробелов, хотя.Помните, что комментарии считаются пробелами.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...