Я бы хотя бы немного соблазнился использовать встроенные функции C99 для «покрытия» функций libpcap.Если функция libpcap имеет значение unsigned char *libpcap_func(int fd, unsigned char *buffer, size_t buflen)
, то вы можете написать и использовать:
static inline char *pc_libpcap_func(int fd, char *buffer, size_t buflen)
{
return (char *)libpcap_func(fd, (unsigned char *)buffer, bufflen);
}
Конечно, это будет заголовок.Префикс pc_
предназначен для «обычного char
».Вы можете написать одну из этих функций покрытия для каждой используемой вами функции libpcap (возможно, даже для тех, которые не принимают никаких простых указателей на символы, только для согласованности).
Вы должны написать свой код для вызоваpc_
версии функции.
Поскольку они встроены, они будут такими же эффективными, как макросы, что было бы классическим способом решения проблемы:
#define libpcap_func(fd, buffer, buflen) \
((char *)(libpcap_func)(fd, (unsigned char *)(buffer), bufflen)
Этот немного хитрый код основывается на том факте, что когда имя макроса, похожее на функцию, появляется без открывающей скобки в качестве следующего токена, это не вызов этого макроса, а также тот факт, что когда макрос расширяется, его символбольше не подходит для расширения (предотвращение бесконечной рекурсии в препроцессоре; ISO / IEC 9899: 1999 § 6.10.3.4 «Повторное сканирование и дальнейшая замена»).Или вы можете назвать макросы с префиксом pc_
, как со встроенными функциями.