C: 2 разных заголовка определяют struct udphdr.Как сказать GCC выбрать один? - PullRequest
0 голосов
/ 21 марта 2012

Я работаю с кодом pcap, и структура udphdr, похоже, определена в двух разделах. Как сказать GCC использовать определенный?

Ответы [ 4 ]

3 голосов
/ 06 июня 2012

Если вы хотите использовать элементы uh_ *, вы должны использовать макрос -D_BSD_SOURCE в качестве параметра gcc, несмотря на то, что вы получаете следующие ошибки:

error: ‘struct udphdr’ has no member named ‘uh_sport’
error: ‘struct udphdr’ has no member named ‘uh_dport’
error: ‘struct udphdr’ has no member named ‘uh_ulen’
error: ‘struct udphdr’ has no member named ‘uh_sum’
error: ‘struct udphdr’ has no member named ‘uh_sum’
2 голосов
/ 21 марта 2012

Если присмотреться к /usr/include/netinet/udp.h, проблема не в том, что одна и та же структура определена в двух разных заголовках.В этом файле он определен как:

/* UDP header as specified by RFC 768, August 1980. */
#ifdef __FAVOR_BSD

    struct udphdr {
        u_int16_t uh_sport;  /* source port */
        u_int16_t uh_dport;  /* destination port */
        u_int16_t uh_ulen;   /* udp length */
        u_int16_t uh_sum;    /* udp checksum */
    };

#else

    struct udphdr {
        u_int16_t source;
        u_int16_t dest;
        u_int16_t len;
        u_int16_t check;
    };

#endif

Так что похоже, что он использует версию структуры POSIX, которая, я считаю, в порядке.

0 голосов
/ 21 марта 2012

Я не вижу простого способа справиться с этим. Я провел несколько тестов с #undef безуспешно.

Я бы повторно объявил struct, что вас интересует, где-то еще в вашем собственном коде , под другим именем, чтобы избежать конфликта, и затем использовал бы его в коде с этим новым именем.

Конечно, у этого подхода есть проблемы: что произойдет, если исходный заголовок будет обновлен и эта структура изменится (некоторые новые члены, другие будут удалены), вы понимаете, о чем я?

0 голосов
/ 21 марта 2012

Просто используйте правильный: netinet/udp.h под Linux:

Из стандартной базы Linux:

http://www.linuxbase.org/navigator/browse/type_single.php?cmd=display&id=37079

...