繁体   English   中英

gcc编译器未报告inet_ntoa的错误

[英]gcc compiler not reporting error for inet_ntoa

在没有arpa / inet.h include的情况下使用inet_ntoa时,编译器为什么不报告错误?

我运行了这段代码:

struct sockaddr_in dest;
printf("%d\n", inet_ntoa(dest.sin_addr));

它返回一个非常大的有符号整数。 我有以下内容:

sys/types.h
sys/socket.h
netinet/in.h
netdb.h
stdio.h
errno.h
sys/time.h
stdlib.h
strings.h
string.h

gcc编译器版本:4.1.2 20080704(red Hat 4.1.2-55)

操作系统:ssh bash与linux系统的接口

C90标准不需要在使用函数之前就对其进行声明或定义-主要是因为这样做会破坏大量现有的C代码,并且该标准的主要目标之一是避免破坏大多数现有的C代码。 这意味着C90编译器推断未声明的函数的返回类型为int 它指出,依靠这种隐式声明已经过时了。

C99标准很好地实现了过时的承诺,并要求在使用函数之前先声明它们。 C11继续执行该要求。 但是,大多数编译器仍然默认允许旧样式代码进行编译,并且GCC是一个特定的示例。 但是,在严格的C99遵从性模式下,需要此类声明。

注意,必须声明函数。 尽管非原型声明也已过时,但不一定必须给它们提供原型。

还要注意,可变参数函数(在参数列表中带有省略号...那些函数)必须在C90中使用之前用原型声明。 这意味着必须使用原型声明诸如printf()类的众所周知的标本,该原型可以通过#include <stdio.h>轻松完成(尽管标准也允许使用其他等效机制)。

较旧版本的GCC(-5.x之前的版本)不会在使用之前自动要求函数声明(C90规则)。 GCC 5.x默认使用C11规则,因此必须在使用函数之前声明它们。 所有这些都是默认设置。 您可以控制使用哪个C语言,并给出警告。

我通常将GCC与以下选项一起使用:

gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
    -Wold-style-definition -Werror

这些选项中的某些选项将在GCC 4.1.2中不可用,而GCC 4.1.2如今已经相当老了(根据镜像站点之一提供的源代码判断,是2007年2月)。 例如,它不支持-std=c11 ,但将支持-std=c99-std=gnu99 ,您可以使用90代替99 -Wold-style-definition选项可能也不起作用。 但是,您的代码可以编译的警告选项越多,越好-几乎总是如此。 -Werror选项表示编译器将警告视为错误。 我使用它来保持我的代码干净,但是当您在努力保持清洁度时,可以选择不使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM