正如,标题所说。由于多次包含头文件,我遇到了重定义错误。我知道它的原因,但我不知道如何解决。是的,我之前在一小时内发布了相同的问题。但我无法正确解释(我认为如此),并没有得到预期的答案。这是链接:
我没有编辑那个问题,因为它已经填满了:)。
好的我有一些类,它们的结构是这样的:
main.cpp中:
#include "Server.h"
#include "Handler.h"
#include "Processor.h"
int main(int argc, char* argv[])
{
}
Server.h:
// Server.h
#pragma once
#include <winsock2.h>
handler.h中:
// Handler.h
#pragma once
#include <string>
#include <vector>
#include "Server.h"
Processor.cpp:
// Processor.cpp
#include "StdAfx.h"
#include "Processor.h"
#include "Handler.h"
Server.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.>
被包括两次,我该如何解决?
由于
答案 0 :(得分:5)
在您的项目设置中: 项目属性 - &gt;配置 - &gt;高级 - &gt; show include。
它会转储标题包含树,从那里你就能看到罪魁祸首。
答案 1 :(得分:1)
在包含stdafx或windows之前,您需要部分或全部。
#define _MSWSOCK_
#define NCB_INCLUDED
#define _WINSOCK2API_
#define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */
答案 2 :(得分:1)
我最近遇到了同样的问题并在包含winsock2.h
之前解决了问题,包括windows.h
。
答案 3 :(得分:0)
您是否尝试过我们在您的其他答案中提出的任何建议?
说真的,尝试使用包含警戒而不是#pragma once
。
如果您仍然得到问题,那么可能会回来并在SO上发布另一个问题。不要发布有关同一事物的多个问题,因为您不愿意(或无法)接受我们的建议!
答案 4 :(得分:0)
尝试替换
#include <winsock2.h>
与
#ifndef _WINSOCK2API_
#include <winsock2.h>
#endif
由于_WINSOCK2API_是在winsock2.h中定义的,编译器不会尝试多次包含它。
答案 5 :(得分:0)
我似乎记得有这个问题。 我认为windows.h和winsock2.h之间存在依赖性问题 我似乎记得我在winsock2.h之前总是包括windows.h,无论它在哪里使用过。