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

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

4 ответа

Если вы хотите элементы 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


Более внимательно рассмотрев /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, которая, я считаю, в порядке.


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

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

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


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

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

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

licensed under cc by-sa 3.0 with attribution.