c ++,是否可能在不同的头文件中有两个同名的联合

c++, is that possible to have two unions with the same name in different header files

一个系统中有两个头文件,我需要包含这两个头文件才能与系统交互,这两个头文件是agentRegistrationUnioncounterCollectUnionContent.h,这两个头文件files 没有什么特别的,只有两个 union,但这两个 union 有相同的名字,唯一的区别是 unions 的内容,unions 看起来像这样:

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;

};

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;

您可以使用以下小技巧在不修改 header 的情况下更改联合的名称:

#define SIGNAL CCUCSIGNAL

#include <counterCollectUnionContent.h>

#undef SIGNAL

那你可以把counterCollectUnionContent.h里面的union称为CCUCSIGNAL,另外一个还是SIGNAL