当前位置:主页 >澳门威尼人斯和澳

澳门威尼人斯和澳:文件重定义冲突的分析与解决

发布时间:01月11日 阅读:676



小序

无意偶尔候看到论坛上有人问编译时重定义征象的问题。这个问题与头文件包孕冲突有关,改一改相关头文件包孕就会让问题消掉。我在这里要以这3个头文件为例阐发为什么会孕育发生这种缘故原由;然后给出一种不会孕育发生冲突的做法;着末就此例的阐发给出结论。本文对付已经知道冲突缘故原由的读者是多余的,但对付一时没有光阴去解的人照样有必然的参考代价的。

一个重命名的例子

先写一个socket基础操作类:

// SocketBase.h

#ifndef _SOCKET_BASE_H_

#define _SOCKET_BASE_H_

#include

#pragma comment(lib, "ws32_2.lib")

class Socket

{

};

#endif

写一个TCP监听类,它从Socket派生:

// TcpListener.h

#ifndef _TCP_LISTENER_H_

#d澳门威尼人斯和澳efine _TCP_LISTENER_H_

#include "Socket澳门威尼人斯和澳Base.h"

class TcpListener : Socket

{

};

#endif

在基于MFC的工程顶用 TcpListener 监听客户连接,同时这个地方须要用到 Windows 某些头文件。

#include "stdafx.h"

#include "TcpListener.h"

void fun()

{

TcpListener* listen = new TcpListener;

……

}

下面是头文件包孕关系:

Stdafx.h -> windows.h -> winsock.h winsock2.h

TcpListener.h -> SocketBase.h -> winsock2.h

编译,呈现N多重定义差错。这个差错与stdafx.h中的 wind澳门威尼人斯和澳ows.h 和TcpListener.h 的 winsock2.h 有关,下面说两种打消差错的措施。

针对本工程中打消编译

差错孕育发生的缘故原由是 win澳门威尼人斯和澳dows.h 中有:

#include

#include

孕育发生重定义的是 windows.h 中的 winsock.h 相关定义与 TcpListener.h 中 winsock2.h 相关定义冲突。相同头文件是不会冲突的,由于有 "#ifndef #define …. #endif";假如windows中只包孕一个winsock2.h就不会孕育发生重定义了。

现在我们只要把 SocketBase.h 中的 "include和 #pragma…"注释了就编译经由过程了。但颠末注释的 SocketBase.cpp 与 TcpListener.cpp 零丁编译就通不过了。这种只是针对特定的情况下办理问题,我们得想一个对照专业的法子。

一个可被吸收的办理措施

Winsock2.h 与 windows.h 中的 winsock.h 相关项的重定义要在 SocketBase.h 中避免。在 SocketBase.h加一些编译前提就可以做到这一点,颠末改动的 SockBase.h 如下:

#ifndef _SOCKET_BASE_H_

#define _SOCKET_BASE_H_

#ifndef _WINSOCKAPI_      // 没有包孕winsock.h

#define _WINSOCKAPI_      // 避免再包孕winsock.h

#ifndef _WINSOCK2API_   // 没有包孕winsock2.h

#define _WINSOCK2API_   // 避免再包孕winsock2.h

#include

#pragma comment(lib, "ws32_2.lib")

#endif

#endif

class So澳门威尼人斯和澳cket

{

};

#endif

颠末这样改动,就能做到 winsock.h 与 winsock2.h 中的相关项重定义了。

结论

经由过程对上述例子的阐发办理,同样在其它类似的问题中适用。假如有更简单的措施避免重定义的环境呈现,请奉告我一下。

参考

Win32 sdk中的 windows.h;

Win32 sdk中的 winsock.h;

Win32 sdk中的 winsock2.h;



上一篇:澳门威尼l斯人网址:嫩嫩的彩椒炒牛肉
下一篇:澳门威斯尼平台9499:唐人街探案阿温在酒吧唱的歌叫什么? 《刺激2005》情歌串烧引观众飙泪