【问题标题】:C++ redefinition due to including header files multiple times由于多次包含头文件而导致 C++ 重新定义
【发布时间】:2010-11-25 06:44:48
【问题描述】:

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

C++ Redefinition Header Files

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

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

ma​​in.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"

问题是&lt;winsock2.h&gt; 被多次包含,不知道在哪里,但它在哪里。 #pragma once 的作用与

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

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

谢谢

【问题讨论】:

  • StdAfx.h 中有什么?
  • 问同一个问题两次会造成重复。投票结束。

标签: c++ file header redefinition


【解决方案1】:

我似乎记得遇到过这个问题。 我认为 windows.h 和 winsock2.h 之间存在依赖问题 我似乎记得我总是通过在 winsock2.h 之前包含 windows.h 来解决它。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      尝试替换

      #include <winsock2.h>
      

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          说真的,尝试使用包含保护而不是 #pragma once

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

          【讨论】:

          • 除了 MS 特异性之外,#pragma once 有什么问题?
          • 说真的,您的建议是“我不使用 MSVC 或 GCC,所以您不应该使用这些编译器的非标准功能”?如果有人对线程有问题,我们不会说“先让你的程序单线程,否则你不能指望任何人帮助你”。
          • 这个“建议”是在哪里提出的?我要说的是,我们通常会要求人们在没有阅读人们最初给出的答案的情况下不要发布重复或几乎重复的问题!
          • 哦,对不起,这很公平。我以为你是说在#pragma once 被删除之前你不能回答这个问题。但我认为提问者已经阅读了这些答案,并在这个问题中指出了同样多的内容,并发布了后续问题,“假设 #pragma once 确实有效,和以前一样”。所以他已经阅读了这些答案,只是认为它们与他最初想问的问题没有任何关系。
          【解决方案6】:

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

          #define _MSWSOCK_
          #define NCB_INCLUDED
          #define _WINSOCK2API_
          #define _WINSOCKAPI_   /* Prevent inclusion of winsock.h in windows.h */
          

          【讨论】:

          • @Manzoor:这是 MS 标头的布局方式。你必须遵守规则,但我不知道规则记录在哪里。在使用 MS 工具链时,我总是发现让他们的向导生成初始的空项目是有利的。这样可以确保一切都正确设置,并避免您在此类事情上花费数小时。
          • 我不知道为什么。我在我的项目中遇到了这个问题,因为我必须包含一个使用 MFC 的外部标头。虽然有可能解决这个问题,但这个解决方案速度很快,而且没有副作用。
          猜你喜欢
          • 2020-07-08
          • 2010-09-18
          • 2020-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多