c ++,可能在不同的头文件中有两个具有相同名称的联合

时间:2015-03-17 16:26:48

标签: c++ include unions

系统中有两个头文件,我需要包含这两个头文件才能与系统交互,两个头文件是agentRegistrationUnioncounterCollectUnionContent.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;

};

2 个答案:

答案 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