2017-02-18 8 views
14

Я ищу в if_link.h в заголовках ядра Linux и содержит это перечисление:Зачем определять макрос с тем же именем и содержимым в C?

enum { 
     IFLA_UNSPEC, 
     IFLA_ADDRESS, 
     IFLA_BROADCAST, 
     IFLA_IFNAME, 
     IFLA_MTU, 
     IFLA_LINK, 
     IFLA_QDISC, 
     IFLA_STATS, 
     IFLA_COST, 
#define IFLA_COST IFLA_COST 
     IFLA_PRIORITY, 
#define IFLA_PRIORITY IFLA_PRIORITY 
     IFLA_MASTER, 
#define IFLA_MASTER IFLA_MASTER 
.... 
} 

В определяет смотреть бесполезно; Какова их цель? И почему только некоторые из них определяют?

+6

Возможно, код использует '#ifdef IFLA_COST' где-то –

+0

Что действительно озадачивает, зачем определять макросы там. Потому что действительно, возможно, для них в другом месте есть возможность ожидать, что они будут макросами. –

+3

Возможно, раньше существовал 'define', который был изменен на перечисление, и это только для обратной совместимости. Вы попробовали «git wame»? – coredump

ответ

9

Как Мэтью Слейтер mentioned in another answer, руководство GCC имеет раздел, а именно §3.10.5 Self-Referential Macros, в котором описываются возможные применения таких макросов.

Один из возможных вариантов использования заключается в том, чтобы избежать бесконечного расширения, когда макрос расширяется в вызов сам по себе, но это отвратительная практика. Другое использование, чтобы определить как препроцессор макросы и перечисления:

Вы могли бы сделать это, если вы хотите, чтобы определить числовые константы с перечислением, но имеет `#ifdef» быть истинными для каждой константы.

Так что это в основном то, что M.M сказал в вышеуказанном комментарии.

Это, кажется, подтверждается this patch:

< декламация > Почему разработчики ядра ведут себя так непоследовательно? Я много предпочитают интерфейсы, в которых значение перечислимого типа добавляется как значение для , чтобы было легко определить, какие функции доступны в текущем наборе заголовков .

Действительно разочаровывает часть является некоторые значения перечислений в этом наборе есть #defines, и некоторые из них не делают.

1

Этот макрос используется в Протокол IPv4 обеспечивает возможность создания, удаления или получения информации о конкретном сетевом интерфейсе. См. man page.

+2

На самом деле это не объясняет, почему существует сочетание макросов и перечислений , Я ничего не нашел в этой ссылке, но, возможно, я пропустил это. Можете ли вы привести соответствующую часть страницы руководства? – coredump

Смежные вопросы