Ответ 1
Стандарт POSIX требует, чтобы "символические константы", такие как MSG_DONTROUTE
, были "объектноподобными макросами", а не перечисляемыми. Определение их самих позволяет использовать их в контексте перечисления, а также правильно работать с, например, #ifdef
.
Из стандарта POSIX:
Заголовок должен определять следующие символические константы.... MSG_DONTROUTE
и
символическая константа... относится к символу препроцессора C (также без аргументов).
И, наконец, из приложения:
Если константе требуется быть макросом, но также разрешено быть другим типом константы, такой как константа перечисления, для реализаций, которые определяют ее как другой тип константы, макрос обычно определяется следующим образом:
#define macro_name macro_name
Это позволяет приложениям использовать #ifdef и т.д., чтобы определить, определен ли макрос, но макрос не используется в директивах #if препроцессора, поскольку препроцессор будет обрабатывать нерасширенное слово macro_name как имеющее нулевое значение.