LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 993|回复: 2

为什么会有警告,是不是GCC的BUG?

[复制链接]
发表于 2007-4-3 21:43:09 | 显示全部楼层 |阅读模式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/un.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <errno.h>

char *
sock_ntop(const struct sockaddr *sa, socklen_t salen)
{
    char                portstr[8];
    static char str[128];                /* Unix domain is largest */

        switch (sa->sa_family) {
        case AF_INET: {
                struct sockaddr_in        *sin = (struct sockaddr_in *) sa;

                if ( inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL)
                        return(NULL);
                if (ntohs(sin->sin_port) != 0) {
                        snprintf(portstr, sizeof(portstr), ":%d", ntohs(sin->sin_port));
                        strcat(str, portstr);
                }
                return(str);
        }
        default:
                snprintf(str, sizeof(str), "sock_ntop: unknown AF_xxx: %d, len %d",
                                 sa->sa_family, salen);
                return(str);
        }
    return (NULL);
} /** end sock_ntop **/

这个函数,我用gcc -c 编译时提示:
sockaddr.c: 在函数 ‘sock_ntop’ 中:
sockaddr.c:340: 警告:比较指针和整数
就是这句: ( inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL)
这是UNP上的代码,但是如果我给改成:
( ! inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)))
就没有警告了,
这是不是GCC的BUG?
发表于 2007-4-3 21:55:07 | 显示全部楼层
根据 man inet_ntop 的说明
  1. SYNOPSIS
  2.        #include <sys/types.h>
  3.        #include <sys/socket.h>
  4.        #include <arpa/inet.h>
  5.        const char *inet_ntop(int af, const void *src,
  6.                              char *dst, socklen_t cnt);
复制代码
注意它需要的头文件,与楼主的代码不同在于 arpa/inet.h。inet_ntop 的声明正是在此头文件中。加上对它的引用后,编译不再有 warning。很多经典书籍所针对的系统版本较低,与我们所使用的系统会有些许不同。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-4 09:21:52 | 显示全部楼层
谢了,的确如此,
不好意思
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表