C ++重定义头文件(winsock2.h) [英] C++ Redefinition Header Files (winsock2.h)

查看:639
本文介绍了C ++重定义头文件(winsock2.h)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何防止包含头文件两次?问题是我在 MyClass.h 中加入 ,然后在许多文件中加入 MyClass.h ,因此它包含多个次数和重新定义错误。如何防止?



我使用#pragma一次,而不是包含警卫,我想这很好。



MyClass.h:

  // MyClass.h 
#pragma once

#include< winsock2.h>

class MyClass
{

//方法
public:
MyClass(unsigned short port);
virtual〜MyClass(void);
};

编辑:我获得的错误很少

  c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(91):警告C4005:'AF_IPX':宏重新定义
c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(460):参见'AF_IPX'$的前面定义b $ bc:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(124):warning C4005:'AF_MAX':宏重新定义
c:\program文件\microsoft sdks\windows\v6.0a\include\winsock.h(479):请参阅以前的'AF_MAX'定义
c:\program files\microsoft sdks\windows\v6 .0a \include\ws2def.h(163):warning C4005:'SO_DONTLINGER':宏重新定义
c:\program files\microsoft sdks\windows\v6.0a\include\winsock .h(402):参见'SO_DONTLINGER'之前的定义
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(206):error C2011: sockaddr':'struct'type redefinition
c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(485):参见声明sockaddr
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384):错误C2143:语法错误:缺少'}'''常量'
c:\\ \\program files\microsoft sdks \windows\v6.0a\include\ws2def.h(384):错误C2143:语法错误:缺少';'之前的'常量'
c:\program文件\microsoft sdks \windows\v6.0a\include\ws2def.h(384):错误C2059:语法错误:'常量'
c:\program files\microsoft sdks\windows\\ \\v6.0a\include\ws2def.h(437):错误C2143:语法错误:缺少';'before'}'
c:\program files\microsoft sdks \windows \v6。 0a \include\ws2def.h(437):错误C4430:缺少类型说明符 - int。注意:C ++不支持default-int
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437):error C4430:missing type specifier - int假定。注意:C ++不支持default-int
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(518):warning C4005:'IN_CLASSA':macro redefinition
c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(287):参见以前的'IN_CLASSA'定义
c:\program files \microsoft sdks \windows\v6.0a\include\ws2def.h(524):warning C4005:'IN_CLASSB':宏重新定义
c:\program files\microsoft sdks\windows\\ \\v6.0a\include\winsock.h(293):请参阅以前的'IN_CLASSB'定义
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def .h(530):warning C4005:'IN_CLASSC':宏重新定义
c:\program files\microsoft sdks\windows\v6.0a\\\\\\\\定义'IN_CLASSC'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(541):warning C4005:'INADDR_ANY':宏重定义
c:\program files\microsoft sdks\windows\v6.0a\\\\\\\\\\\\\\\\\\\\\\\\ \windows\v6.0a\include\ws2def.h(543):warning C4005:'INADDR_BROADCAST':宏重新定义
c:\program files\microsoft sdks\windows\v6.0a \include\winsock.h(306):请参阅'INADDR_BROADCAST'以前的定义
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(577 ):error C2011:'sockaddr_in':'struct'type redefinition
c:\program files\microsoft sdks\windows\v6.0a\\\\\\\\\\\\\\\ 'sockaddr_in'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(132):error C2011:'fd_set':'struct'type redefinition
c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(68):请参见声明fd_set
c:\program files\microsoft sdks \windows\v6.0a\include\winsock2.h(167):warning C4005:'FD_SET':宏重新定义
c:\program files\microsoft sdks\windows\v6.0a \include\winsock.h(102):见以前的'FD_SET'定义
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(176 ):错误C2011:'timeval':'struct'type redefinition
c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(111):请参见声明'timeval'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(232):错误C2011:'hostent':'struct'type redefinition
c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(167):请参见hostent的声明
c:\program files\microsoft sdks \windows \v6.0a\include\winsock2.h(245):error C2011:'netent':'struct'type redefinition
c:\program files\microsoft sdks\windows\ v6.0a\include\winsock.h(180):见netent的声明
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h (252):error C2011:'servent':'struct'type redefinition
c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(187):see声明'servent'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(264):错误C2011:'protoent':'struct'type redefinition
c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(199):参见protoent的声明

解决方案

此问题是由于包含< windows.h> 之前< winsock2.h> 。尝试安排您的包含列表< winsock2.h> 之后包含< windows.h> code> _WINSOCKAPI _ 第一个:

  #define _WINSOCKAPI_ //停止windows.h,包括winsock .h 
#include< windows.h>
// ...
#includeMyClass.h//其中包括< winsock2.h>

另请参阅


How do I prevent from including header files twice? The problem is I'm including the in MyClass.h and then I'm including MyClass.h in many files, so it includes multiple times and redefinition error occurs. How to prevent?

I'm using #pragma once instead of include guards, and I guess that's fine.

MyClass.h:

// MyClass.h
#pragma once

#include <winsock2.h>

class MyClass
{

// methods
public:
 MyClass(unsigned short port);
 virtual ~MyClass(void);
};

EDIT: Few of the errors I'm getting

c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(91) : warning C4005: 'AF_IPX' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(460) : see previous definition of 'AF_IPX'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(124) : warning C4005: 'AF_MAX' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(479) : see previous definition of 'AF_MAX'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(163) : warning C4005: 'SO_DONTLINGER' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(402) : see previous definition of 'SO_DONTLINGER'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(206) : error C2011: 'sockaddr' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(485) : see declaration of 'sockaddr'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2143: syntax error : missing '}' before 'constant'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2143: syntax error : missing ';' before 'constant'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2059: syntax error : 'constant'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C2143: syntax error : missing ';' before '}'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(518) : warning C4005: 'IN_CLASSA' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(287) : see previous definition of 'IN_CLASSA'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(524) : warning C4005: 'IN_CLASSB' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(293) : see previous definition of 'IN_CLASSB'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(530) : warning C4005: 'IN_CLASSC' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(299) : see previous definition of 'IN_CLASSC'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(541) : warning C4005: 'INADDR_ANY' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(304) : see previous definition of 'INADDR_ANY'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(543) : warning C4005: 'INADDR_BROADCAST' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(306) : see previous definition of 'INADDR_BROADCAST'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(577) : error C2011: 'sockaddr_in' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(312) : see declaration of 'sockaddr_in'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(132) : error C2011: 'fd_set' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(68) : see declaration of 'fd_set'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(167) : warning C4005: 'FD_SET' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(102) : see previous definition of 'FD_SET'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(176) : error C2011: 'timeval' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(111) : see declaration of 'timeval'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(232) : error C2011: 'hostent' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(167) : see declaration of 'hostent'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(245) : error C2011: 'netent' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(180) : see declaration of 'netent'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(252) : error C2011: 'servent' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(187) : see declaration of 'servent'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(264) : error C2011: 'protoent' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(199) : see declaration of 'protoent'

解决方案

This problem is caused when including <windows.h> before <winsock2.h>. Try arrange your include list that <windows.h> is included after <winsock2.h> or define _WINSOCKAPI_ first:

#define _WINSOCKAPI_    // stops windows.h including winsock.h
#include <windows.h>
// ...
#include "MyClass.h"    // Which includes <winsock2.h>

See also this.

这篇关于C ++重定义头文件(winsock2.h)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆