什么是弃用警告?
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
例程的功能。
我正在使用 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
例程的功能。