为什么既要使用匿名枚举又要为常量定义宏?

Why use both anonymous enum and define macros for constants?

为什么 netinet/in.h 以这种方式定义常量?

enum
{
    IPPROTO_IP = 0,    
#define IPPROTO_IP          IPPROTO_IP
    IPPROTO_HOPOPTS = 0,   
#define IPPROTO_HOPOPTS     IPPROTO_HOPOPTS
    IPPROTO_ICMP = 1,      
#define IPPROTO_ICMP        IPPROTO_ICMP
    IPPROTO_IGMP = 2,      
    ...
};

可能还有其他代码依赖 #ifdef IPPROTO_IP