Переопределение перечислителей с помощью #define - PullRequest
5 голосов
/ 26 июля 2011

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

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

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

Ответы [ 3 ]

5 голосов
/ 26 июля 2011

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

#ifdef NUM_FILES

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

4 голосов
/ 26 июля 2011

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

#ifdef SOCK_STREAM
..
#endif

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

Edit: Так что это объединяетболее чистый подход перечислений (неявные значения без коллизий и областей видимости) с тестами препроцессора.

0 голосов
/ 26 июля 2011

Я подозреваю, что IDE или другие инструменты понимают, что символ определенным образом определен.

...