我有一个包含一些类代码的 .h 文件 - overlay.h
#include<iostream>
#include<boost/thread.hpp>
#include<vector>
#include<boost/asio.hpp>
#include <string>
#include <boost/serialization/vector.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <sstream>
#include <boost/tuple/tuple.hpp>
#include<member.h>
using boost::asio::ip::tcp;
class overlay_server{...};
struct member{
std::string ip_address;
short int port;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & ip_address;
ar & port;
}
};
现在我将结构移动到另一个名为 member.h 的新文件 并包含此文件,以便我的类 overlay_server 可以使用它。 现在,当我构建程序时出现错误。
我应该做哪些更改才能使这项工作正常进行? 我在 SO 上阅读了有关 header guards 的信息,但无法真正理解如何在此处实现它来解决问题。
----编辑----
成员.h
struct member{
std::string ip_address;
short int port;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & ip_address;
ar & port;
}
};
运行.cpp
#include<overlay_server.h>
#include<overlay_client.h>
int main(){
overlay_server overlay_server_(8002);
boost::thread thread_(boost::bind(&overlay_server::member_list_server, overlay_server_));
overlay_client overlay_client_("127.0.0.1",8002);
overlay_client_.member_list_client();
thread_.join();
}
我没有在任何地方重新定义结构。 我有另一个名为 overlay_client 的类,它也使用结构成员。
在我的主要功能中,我创建了 overlay_server 和 overlay_client 的对象。 现在我的程序只有在 overlay_server.h 中包含 member.h 时才会运行(尽管 overlay_server 和 overly_client 中的代码都需要它) 如果它包含在两者中,那么我会得到重新定义错误
为什么?
----编辑----
我的 member.h 中的这段代码解决了这个问题 Compile error "'struct' type redefinition" although it's the first definition for it
最佳答案
您也可以使用 pragma
并获得相同的效果。在所有头文件的顶部,写:
#pragma once
rest of the header
.
.
.
而include guards的使用方法是将一个头文件中的所有内容都用include guard包围起来,如下所示:
// At the very top
#if !defined(SOME_SYMBOL)
#define SOME_SYMBOL
rest of the header
.
.
.
// At the very bottom
#endif // SOME_SYMBOL
现在,选择一个合理的名称而不是 SOME_SYMBOL
是非常重要。大多数程序员根据文件名(以及路径和项目名称以及公司/个人名称)创建保护名称。例如,对于位于“[项目根目录”中的名为“some_header.h”(或“SomeHeader.h”)的 header ]/include/myproject",您可以将守卫名称命名为 __INCLUDE__MY_PROJECT__SOME_HEADER_H__
。但这只是一个建议;任何独特的符号都可以。
您还可以结合使用 pragma
和 include guard(因为 pragma
方法可以在非常大的项目中 boost 编译时间,但是不是所有的编译器都支持它。)如果你想要它们,你会写:
#pragma once
#if !defined(__INCLUDE__MY_PROJECT__SOME_HEADER_H__)
#define __INCLUDE__MY_PROJECT__SOME_HEADER_H__
rest of the header
.
.
.
#endif // __INCLUDE__MY_PROJECT__SOME_HEADER_H__
这没有负面影响(据我所知),只是有可能防止构建错误并使您的构建更快(在大型项目上)。但是请注意包含守卫和 #pragma once
不完全相同。在极少数情况下,您可能需要使用其中之一,或者两者都不用。
关于c++ - 错误 C2011 : 'member' : 'struct' type redefinition on moving a struct to a new header file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16727462/