系统中有两个头文件,我需要包含这两个头文件才能与系统交互,两个头文件是agentRegistrationUnion
和counterCollectUnionContent.h
,这两个头文件包含没有什么特别的,只有两个工会,但这两个工会有相同的名字,唯一的区别是工会的内容,工会看起来像这样:
union SIGNAL
{
struct s1 ss1;
struct s2 ss2;
......
};
我无法更改这些头文件,当我包含这些头文件时,我得到了error: redefinition of 'union SIGNAL'
,我怎么能在我的代码中同时拥有这两个联合?
我的头文件:
#include <vector>
#include <map>
#include <string>
#include <stdint.h>
#include "agentRegistrationUnion.h" //I only want to separate these two files
#include "counterCollectUnion.h"
using namespace std;
class InvalidSig;
struct args{
InvalidSig* context;
string mname;
union SIGNAL *content;
};
class InvalidSig{
public:
InvalidSig();
~InvalidSig();
void Send_inval_sig();
void Kill_proc();
bool InitAttacker(char *argv);
void LocateVictims();
itc_msg* AllocMsg(union SIGNAL *content);
void PrintVictims(itc_mbox_id_t vic);
void *sendmsg(void *mname);
static void *sendmsg_helper(void *ar){
string n = ((args*)ar)->mname;
return ((args*)ar)->context->sendmsg(&n);
};
multimap<string,string> mboxes;
union SIGNAL *content;
};
答案 0 :(得分:4)
在agentRegistrationUnion.h
:
namespace Agent { // or some appropriate name
union SIGNAL { ... };
}
在counterCollectUnion.h
:
namespace Counter { // or some appropriate name
union SIGNAL { ... };
}
在使用过程中,通过为命名空间添加前缀来引用所需的联合:
Agent::SIGNAL signal;
signal.ss1 = ...;
如果您无法更改这些头文件,那么这应该有效:
namespace Agent {
#include "agentRegistrationUnion.h"
}
namespace Counter {
#include "counterCollectUnion.h"
}
Agent::SIGNAL agentSignal;
Counter::SIGNAL counterSignal;
答案 1 :(得分:1)
您可以使用以下小技巧更改联合的名称而不修改标题:
#define SIGNAL CCUCSIGNAL
#include <counterCollectUnionContent.h>
#undef SIGNAL
然后你可以将counterCollectUnionContent.h中的union称为CCUCSIGNAL,另一个仍然是SIGNAL