C语言 什么是不推荐的警告?



我正在使用c和libpcap函数编写一个数据包嗅探器。以下是源代码:

#include <pcap.h>
#include <stdlib.h>
#include <stdio.h>
#include "YYY.h"

void pcap_fatal(const char *failed_in, const char *errbuf){
printf("Fata Error in %s: %sn", failed_in, errbuf);
exit(1);
}

int main(){
struct pcap_pkthdr header;
const u_char *packet;
char errbuf[PCAP_ERRBUF_SIZE];
char *device;
pcap_t *pcap_handle;
int i;


device = pcap_lookupdev(errbuf);
if(device == NULL)
pcap_fatal("pcap_lookupdev", errbuf);
printf("Sniffing of device %sn", device);

pcap_handle = pcap_open_live(device, 4096, 1, 0, errbuf);

for(i=0;i<3;i++){
packet = pcap_next(pcap_handle, &header);
printf("Got a %d bute packetn", header.len);
dump(packet, header.len);
}

pcap_close(pcap_handle);
}

然而,当我试图用gcc编译它时,它给出了如下警告:

libcap_sniff.c: In function ‘main’:
libcap_sniff.c:20:2: warning: ‘pcap_lookupdev’ is deprecated: use 'pcap_findalldevs' and use the first device [-Wdeprecated-declarations]
20 |  device = pcap_lookupdev(errbuf);
|  ^~~~~~
In file included from /usr/include/pcap.h:43,
from libcap_sniff.c:1:
/usr/include/pcap/pcap.h:394:16: note: declared here
394 | PCAP_API char *pcap_lookupdev(char *)
|                ^~~~~~~~~~~~~~
有谁能帮我一下吗?我还不知道什么是deprecated warning .

pcap_findalldevs代替pcap_lookupdev

弃用软件意味着它可能是可用的,但被认为是过时的,应该避免使用。通常已弃用的软件已被替代。

GCC有标记已弃用函数的特性。当程序使用标记为已弃用的函数时,GCC会发出警告,以便您可以修改代码以使用更现代的函数。已弃用的函数可能会在它们所属的软件的未来版本中被删除。

说明可以使用pcap_findalldevs来完成pcap_lookupdev例程的功能。

gcc有一个叫做function attributes的非标准扩展,它可以用于各种各样的事情,比如在某个内存区域内联或声明函数。可以在函数声明之后(而不是在函数定义之后)编写__attribute__ (arg)

其中一个属性叫做deprecated,它告诉gcc在调用过时的函数时向应用程序程序员发出警告。可选地,可以给deprecated一个消息参数。例子:

#include <stdio.h>
void foo (void) __attribute__((deprecated("consider using bar instead")));
void foo (void)
{
puts("foo");
}
int main (void)
{
foo();
}

这给:

warning: 'foo' is deprecated: consider using bar instead [-Wdeprecated-declarations]
foo();

默认情况下启用此警告。要关闭它,需要显式地使用编译器选项-Wno-deprecated-declarations


至于为什么不推荐使用您的特定函数,您必须查阅(缺少的)文档。man没有提到为什么不推荐。

注意:问题的开头是关于通用的警告。实际问题的正确答案在后面的文章中。

虽然标准只定义了#error指令,但大多数常见的实现都接受非致命的#warning指令。当在编译时可以检测到某些时,库编写者可以使用它们来引发错误或警告。

这只是意味着libpcap的家伙已经弃用了pcap_lookupdev,并且它很可能在以后的版本中被删除。他们只是警告他们的库的用户停止在新代码中使用它。


但这里涉及到不同的机制。Gnu C编译器(但也许其他人)有一个特定的属性来表示反对。它旨在与特殊选项-Wdeprecated-declarations一起使用,以打开弃用警告,并将-Wno-deprecated-declaration关闭。

相关内容

最新更新