Зачем определять макрос с тем же именем и контентом в C?

Я рассматриваю if_link.h в заголовках ядра Linux и содержит это перечисление:

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

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

Ответы

Ответ 1

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

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

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

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

Это, по-видимому, подтверждено этим патчем:

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

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

Ответ 2

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