winpcap findalldevs const char * 与 char * 不兼容
winpcap findalldevs const char * incompatible to char *
我已经安装了开发包 WinPcap,创建了一个新项目并调整了 compiler/linker 设置。我使用 WinPCap 主页上的 very basic example ("obtaining the device list")。但我得到错误:
The argument of type "" const char * "" is incompatible with the parameter "" char * "".
在函数 pcap_findalldevs_ex()
被调用的行中。我已经尝试了所有提到的演员 here.
#include "pcap.h"
main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int i=0;
char errbuf[PCAP_ERRBUF_SIZE];
/* Retrieve the device list from the local machine */
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf);
exit(1);
}
/* Print the list */
for(d= alldevs; d != NULL; d= d->next)
{
printf("%d. %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf(" (No description available)\n");
}
if (i == 0)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return;
}
/* We don't need any more the device list. Free it */
pcap_freealldevs(alldevs);
}
这一行:
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -1)
PCAP_SRC_IF_STRING
常量是一个预处理器宏,它映射到一个窄字符串文字:
#define PCAP_SRC_IF_STRING "rpcap://"
pcap_findalldevs_ex()
的第一个参数需要一个 非常量 char*
指针:
int pcap_findalldevs_ex(
char *source,
struct pcap_rmtauth *auth,
pcap_if_t **alldevs,
char *errbuf
)
在 C++ 中,窄字符串文字的类型为 const char[]
,它会衰减为 const char*
。您不能在需要非 const char*
指针的地方传递 const char*
指针。较旧的 C++ 编译器 可能 允许它,但从 C++11 开始,这 需要 是一个错误。
但是,在这种特殊情况下,您可以安全地放弃常量,因为 pcap_findalldevs_ex()
不会将数据写入 source
参数:
pcap_findalldevs_ex(const_cast<char*>(PCAP_SRC_IF_STRING), ...)
如果您不想这样做,则必须先制作字符串数据的本地非常量副本:
char szSource[] = PCAP_SRC_IF_STRING;
pcap_findalldevs_ex(szSource, ...)
我已经安装了开发包 WinPcap,创建了一个新项目并调整了 compiler/linker 设置。我使用 WinPCap 主页上的 very basic example ("obtaining the device list")。但我得到错误:
The argument of type "" const char * "" is incompatible with the parameter "" char * "".
在函数 pcap_findalldevs_ex()
被调用的行中。我已经尝试了所有提到的演员 here.
#include "pcap.h"
main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int i=0;
char errbuf[PCAP_ERRBUF_SIZE];
/* Retrieve the device list from the local machine */
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf);
exit(1);
}
/* Print the list */
for(d= alldevs; d != NULL; d= d->next)
{
printf("%d. %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf(" (No description available)\n");
}
if (i == 0)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return;
}
/* We don't need any more the device list. Free it */
pcap_freealldevs(alldevs);
}
这一行:
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL /* auth is not needed */, &alldevs, errbuf) == -1)
PCAP_SRC_IF_STRING
常量是一个预处理器宏,它映射到一个窄字符串文字:
#define PCAP_SRC_IF_STRING "rpcap://"
pcap_findalldevs_ex()
的第一个参数需要一个 非常量 char*
指针:
int pcap_findalldevs_ex(
char *source,
struct pcap_rmtauth *auth,
pcap_if_t **alldevs,
char *errbuf
)
在 C++ 中,窄字符串文字的类型为 const char[]
,它会衰减为 const char*
。您不能在需要非 const char*
指针的地方传递 const char*
指针。较旧的 C++ 编译器 可能 允许它,但从 C++11 开始,这 需要 是一个错误。
但是,在这种特殊情况下,您可以安全地放弃常量,因为 pcap_findalldevs_ex()
不会将数据写入 source
参数:
pcap_findalldevs_ex(const_cast<char*>(PCAP_SRC_IF_STRING), ...)
如果您不想这样做,则必须先制作字符串数据的本地非常量副本:
char szSource[] = PCAP_SRC_IF_STRING;
pcap_findalldevs_ex(szSource, ...)