什么是弃用警告?

What is a deprecated warning?

我正在使用 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: %s\n", 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 %s\n", 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 packet\n", 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 *)
      |                ^~~~~~~~~~~~~~

谁能帮我解决这个问题。我还不知道弃用警告是什么。

注意:问题的开头是关于通用 警告 的。实际问题的正确答案稍后在 post.

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

这只是意味着来自 libpcap 的人弃用了 pcap_lookupdev 的用法并且它可能会在以后的版本中被删除。他们只是警告他们库的用户停止在新代码中使用它。


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

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 没有提及它被弃用的原因。

使用 pcap_findalldevs 而不是 pcap_lookupdev

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

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

这个documentation表示可以使用pcap_findalldevs来执行pcap_lookupdev例程的功能。