3

正如标题所说。由于多次包含头文件,我遇到了重新定义错误。我知道是因为这个,但我不知道如何解决。是的,我之前提前一个小时在 SO 中发布了同样的问题。但我无法正确解释(我想是这样),也没有得到预期的答案。链接在这里:

C++ 重定义头文件

我没有编辑那个问题,因为它已经被填满了:)。

好的,我有一些类,它们的结构是这样的:

主.cpp:

#include "Server.h"
#include "Handler.h"
#include "Processor.h"

int main(int argc, char* argv[])
{

}

服务器.h:

// Server.h
#pragma once

#include <winsock2.h>

处理程序.h:

// Handler.h
#pragma once

#include <string>
#include <vector>

#include "Server.h"

处理器.cpp:

// Processor.cpp

#include "StdAfx.h"
#include "Processor.h"
#include "Handler.h"

服务器.cpp:

// Server.cpp

#include "Server.h"
#include "Processor.h"

问题是<winsock2.h>包含多次,不知道在哪里,但它在哪里。#pragma once的作用与

#ifndef SOME_FILE_H
#define SOME_FILE_H
// code here
#endif // SOME_FILE_H

在我的编译器中(在本例中为 MSVC2008)。所以我很确定我不需要标题包括警卫。但是你能发现我在哪里犯了<winsock2.>两次被包含的错误,我该如何解决?

谢谢

4

6 回答 6

6

在您的项目设置中:项目属性 -> 配置 -> 高级 -> 显示包含。

它将转储标头包含树,从那里您将能够看到罪魁祸首。

于 2009-09-03T12:42:41.667 回答
1

我最近遇到了同样的问题,并在包括winsock2.h之前解决了它windows.h

于 2012-11-23T14:44:50.870 回答
1

在包含 stdafx 或 windows 之前,您需要其中的部分或全部。

#define _MSWSOCK_
#define NCB_INCLUDED
#define _WINSOCK2API_
#define _WINSOCKAPI_   /* Prevent inclusion of winsock.h in windows.h */
于 2009-09-03T12:38:47.263 回答
1

尝试更换

#include <winsock2.h>

#ifndef _WINSOCK2API_
#include <winsock2.h>
#endif

由于 _WINSOCK2API_ 在 winsock2.h 中定义,编译器不会尝试多次包含它。

于 2009-09-03T13:13:24.583 回答
0

您是否尝试过我们在其他答案中提出的任何建议?

说真的,尝试使用 include 守卫而不是#pragma once.

如果您仍然遇到问题,那么也许回来并在 SO 上发布另一个问题。不要因为您不愿意(或无法)接受我们的建议而发布关于同一件事的多个问题!

于 2009-09-03T12:40:34.263 回答
0

我好像记得有这个问题。我认为 windows.h 和 winsock2.h 之间存在依赖关系问题我似乎记得我总是通过在使用 windows.h 之前包含 windows.h 来解决它。

于 2012-11-23T14:55:02.527 回答