2014-10-03 2 views
0

У меня есть структура, определенная в файле под названием sock.h:Переменная Struct член не Defined - не имеет член с именем

struct pj_sockaddr_in 
{ 
#if defined(PJ_SOCKADDR_HAS_LEN) && PJ_SOCKADDR_HAS_LEN!=0 
    pj_uint8_t sin_zero_len; /**< Just ignore this.   */ 
    pj_uint8_t sin_family; /**< Address family.   */ 
#else 
    pj_uint16_t sin_family; /**< Address family.   */ 
#endif 
    pj_uint16_t sin_port; /**< Transport layer port number. */ 
    pj_in_addr sin_addr; /**< IP address.   */ 
    char sin_zero[PJ_SOCKADDR_IN_SIN_ZERO_LEN]; /**< Padding.*/ 
}; 

Он ссылается из sock_common.c файла:

PJ_DEF(pj_status_t) pj_sockaddr_in_init(pj_sockaddr_in *addr, 
         const pj_str_t *str_addr, 
        pj_uint16_t port) 
{ 
    PJ_ASSERT_RETURN(addr, (addr->sin_addr.s_addr=PJ_INADDR_NONE, PJ_EINVAL)); 

    PJ_SOCKADDR_RESET_LEN(addr); 
    addr->sin_family = PJ_AF_INET; 
    pj_bzero(addr->sin_zero, sizeof(addr->sin_zero)); 
    pj_sockaddr_in_set_port(addr, port); 
    return pj_sockaddr_in_set_str_addr(addr, str_addr); 
} 

It впадает в ошибки компиляции, которые я не мог понять, почему:

In function 'pj_sockaddr_in_init': 
sock_common.c:error: 'pj_sockaddr_in' has no member named 'sin_zero' 

Мой вопрос заключается в том, как это возможно для поля игнорируются? Другие поля в структуре видны и могут быть указаны. Есть предположения?

PS: исходный код проекта, если интересно: http://svn.pjsip.org/repos/pjproject/trunk

ответ

2

типа C Struct фактически имеют-структуру, как часть их имени. Ваше определение функции должно быть (в зависимости от вашего определения структуры)

PJ_DEF(pj_status_t) pj_sockaddr_in_init(struct pj_sockaddr_in *addr, 
        const pj_str_t *str_addr, 
       pj_uint16_t port) 

Однако, гораздо чаще, просто использовать ЬурейиЙ в объявлении:

typedef struct 
    { 
    #if defined(PJ_SOCKADDR_HAS_LEN) && PJ_SOCKADDR_HAS_LEN!=0 
     pj_uint8_t sin_zero_len; /**< Just ignore this.   */ 
     pj_uint8_t sin_family; /**< Address family.   */ 
    #else 
     pj_uint16_t sin_family; /**< Address family.   */ 
    #endif 
     pj_uint16_t sin_port; /**< Transport layer port number. */ 
     pj_in_addr sin_addr; /**< IP address.   */ 
     char sin_zero[PJ_SOCKADDR_IN_SIN_ZERO_LEN]; /**< Padding.*/ 
    } pj_sockaddr_in; 
+1

+1 в поддержку этого, 'pj_sockaddr_in6' в том же заголовке фактически объявляется корректно через' typedef struct pj_sockaddr_in6 {....} pj_sockaddr_in6; 'Мне кажется, человек, выполняющий эту вещь редко, если когда-либо строит его на компиляторе ** C **. Он * будет * строить как есть через C++-компилятор. – WhozCraig

Смежные вопросы