none
一个vs2010常量定义的问题 RRS feed

  • 问题

  • 今天使用一个RPC的库遇到一个问题,原本一个在vs2010下编译的程序没有问题,有一个警告:XmlRpcSocket.cpp(13): warning C4005: “EINPROGRESS”: 宏重定义

    #if defined(_WINDOWS)
    # include <stdio.h>
    # include <winsock2.h>
    //# pragma lib(WS2_32.lib)
    
    # define EINPROGRESS	WSAEINPROGRESS
    # define EWOULDBLOCK	WSAEWOULDBLOCK
    # define ETIMEDOUT	  WSAETIMEDOUT
    #else
    extern "C" {
    # include <unistd.h>
    # include <stdio.h>
    # include <sys/types.h>
    # include <sys/socket.h>
    # include <netinet/in.h>
    # include <netdb.h>
    # include <errno.h>//EINPROGRESS等三个常量的定义在改文件里
    # include <fcntl.h>
    }
    #endif // _WINDOWS
    
    .....
    
    
    nonFatalError()
    
    {
    
     int err = XmlRpcSocket::getError();
    
     return (err == EINPROGRESS || err == EAGAIN || err == EWOULDBLOCK || err == EINTR);//注意这里用到了两个上面没有重定义而只在errno.h中存在定义的常量
    
    }
    

     

    但是这里我已经设置了预处理变量_WINDOWS了,怎么会包含另一个分支中的errno.h中定义的常量呢?于是我把代码拿到vs2008中编译,编译器给出了两个错误:
    error C2065: “EAGAIN”: 未声明的标识符
    error C2065: “EINTR”: 未声明的标识符
    这时我才发现下文中函数nonFatalError使用了两个在errno.h中定义,而在本执行文件中没有定义的常量。这两个常量在vs2010是编译居然没有报错说明在什么位置已经被定义了,我搜索了整个解决方案发现,这两个常量的定义只存在于errno.h,且errno.h的include也仅存在于由#if defined(_WINDOWS)控制的else分支语句中,并且在工程属性中我定义了_WINDOWS预处理器,照理说errno.h不可能被包含进来。请问为什么在vs2010中会有这种现象,或是由于我的工程属性哪里设置有问题吗?请指教!

     

    2011年3月21日 8:12

答案

  • 这是c与windows的兼容问题。不同版本的VC附带的error.h是不同的,因为error.h是unix c的标准库而不是windows的,

    如果你要用现在已支持windows的库的话,他一般会自带一个windows下的makefile的,你应该用它自带的makefile来编译而不是自己建立工程,他的makefile里面有头部的宏定义


    0xBAADF00D
    2011年3月21日 9:25
    版主