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, ...)