日期:2014-05-16  浏览次数:20743 次

如此使用宏定义第一回见!
以下代码来源于linux /include/linux/if.h 或者unix /net/if.h 

C/C++ code

struct ifreq {
#define IFHWADDRLEN    6
    union
    {
        char    ifrn_name[IFNAMSIZ];        /* if name, e.g. "en0" */
    } ifr_ifrn;
    
    union {
        struct    sockaddr ifru_addr;
        struct    sockaddr ifru_dstaddr;
        struct    sockaddr ifru_broadaddr;
        struct    sockaddr ifru_netmask;
        struct  sockaddr ifru_hwaddr;
        short    ifru_flags;
        int    ifru_ivalue;
        int    ifru_mtu;
        struct  ifmap ifru_map;
        char    ifru_slave[IFNAMSIZ];    /* Just fits the size */
        char    ifru_newname[IFNAMSIZ];
        void __user *    ifru_data;
        struct    if_settings ifru_settings;
    } ifr_ifru;
};

#define ifr_name    ifr_ifrn.ifrn_name    /* interface name     */


以下为某使用上面结构体的代码
C/C++ code

struct ifreq ifr;
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);



ifr_name就一个宏定义 代表 ifr_ifrn.ifrn_name 
难道这里struct ifreq ifr 可以这样用 ifr.ifr_name 这就代表了 ifr.ifr_ifrn.ifrn_name ??!!可以这样用吗? 很神奇呀!

------解决方案--------------------
看不出什么不合理的地方
------解决方案--------------------
。。。。 C语言基础啊,宏是文本替换,没有程序含义。