Переопределение перечислений enum с #define

Я заметил что-то в файлах заголовков C, что я не могу понять, для чего. Например, в файле bits/socket.h существует перечисление типа enum __socket_type , но после каждого перечислителя существует макрос define, который определяет то же самое. Пример:

 enum __socket_type { SOCK_STREAM = 1, #define SOCK_STREAM SOCK_STREAM ... }; 

Я не смог узнать, для чего это. Пожалуйста, просветите меня. Я даже не знаю, как правильно задать вопрос для запроса в Google или в этом поле поиска на сайте.

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

 #ifdef SOCK_STREAM .. #endif 

может использоваться для условной компиляции некоторого кода впоследствии.

Изменить: Таким образом, это сочетает в себе более чистый подход к enumsм (неявные значения без коллизий и обзор) с помощью тестов препроцессора.

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

 #ifdef NUM_FILES 

Теперь это нормально, но если вы напишете #define NUM_FILES NUM_FILES он будет вести себя как макрос для препроцессора и IDE и как перечисление для самого кода.

Я подозреваю, что для IDE или других инструментов понять, что символ определен каким-то образом.