Запрос относительно синтаксиса, используемого в заголовочном файле для программирования сокетов - PullRequest
3 голосов
/ 30 сентября 2010

Это фрагмент кода, который я скопировал из одного из заголовочных файлов для программирования сокетов.

/* Structure describing an Internet socket address.  */
struct sockaddr_in
  {
    __SOCKADDR_COMMON (sin_);
    in_port_t sin_port;                 /* Port number.  */
    struct in_addr sin_addr;            /* Internet address.  */

    /* Pad to size of `struct sockaddr'.  */
    unsigned char sin_zero[sizeof (struct sockaddr) -
                           __SOCKADDR_COMMON_SIZE -
                           sizeof (in_port_t) -
                           sizeof (struct in_addr)];
  };

Я могу понять объявление sin_port и sin_addr.но то, что __SOCKADDR_COMMON in_) здесь.Я не могу понять этот синтаксис?Пожалуйста, объясните.Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 30 сентября 2010

Существует определение макроса:

#define __SOCKADDR_COMMON(sa_prefix) \
  sa_family_t sa_prefix##family

, поэтому __SOCKADDR_COMMON (sin_); фактически расширяется до sa_family_t sin_family;

. Это происходит так, что макрос принимает параметр sa_prefix и использует ## оператор для объединения (присоединения) их.В результате у вас есть новая переменная sin_family, которая объявлена ​​с типом sa_family_t в структуре.

Подробнее о макросах и препроцессоре C

0 голосов
/ 30 сентября 2010

__SOCKADDR_COMMON() будет макросом #define, расширяющим набор общих полей для использования во всех структурах

0 голосов
/ 30 сентября 2010

Это макрос, определенный где-то еще. Это может быть определено как

#define __SOCKADDR_COMMON(sa_prefix) \
  sa_family_t sa_prefix##family

расширяя это, структура будет выглядеть как

struct sockaddr_in
  {
    sa_family_t sin_family;
    in_port_t sin_port;      
 ... 

НЕ копируйте эту структуру в ваш код. Вы должны включить заголовочный файл для вашей системы, который объявляет struct sockaddr_in.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...