Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++,可以在两个头文件中有两个同名的联合_C++_Include_Unions - Fatal编程技术网

C++,可以在两个头文件中有两个同名的联合

C++,可以在两个头文件中有两个同名的联合,c++,include,unions,C++,Include,Unions,一个系统中有两个头文件,我需要包括这两个头文件以便与系统交互,这两个头文件是agentRegistrationUnion和counterCollectUnionContent.h,这两个头文件只包含两个联合,但这两个联合具有相同的名称,唯一的区别是工会的内容,工会看起来是这样的: union SIGNAL { struct s1 ss1; struct s2 ss2; ...... }; 我无法更改这些头文件,当我包含这些头文件时,我遇到了一个错误:重

一个系统中有两个头文件,我需要包括这两个头文件以便与系统交互,这两个头文件是agentRegistrationUnion和counterCollectUnionContent.h,这两个头文件只包含两个联合,但这两个联合具有相同的名称,唯一的区别是工会的内容,工会看起来是这样的:

union SIGNAL
{
    struct s1     ss1;
    struct s2     ss2;
    ......
}; 
我无法更改这些头文件,当我包含这些头文件时,我遇到了一个错误:重新定义“联合信号”,如何在代码中同时包含这两个联合

我的头文件:

#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中:

在联合中。h:

在使用过程中,通过在名称空间前加前缀来引用所需的联合:

Agent::SIGNAL signal;
signal.ss1 = ...;
如果您无法更改这些头文件,那么这应该可以:

namespace Agent {
#include "agentRegistrationUnion.h"
}

namespace Counter {
#include "counterCollectUnion.h"
}

Agent::SIGNAL agentSignal;
Counter::SIGNAL counterSignal;
在agentRegistrationUnion.h中:

在联合中。h:

在使用过程中,通过在名称空间前加前缀来引用所需的联合:

Agent::SIGNAL signal;
signal.ss1 = ...;
如果您无法更改这些头文件,那么这应该可以:

namespace Agent {
#include "agentRegistrationUnion.h"
}

namespace Counter {
#include "counterCollectUnion.h"
}

Agent::SIGNAL agentSignal;
Counter::SIGNAL counterSignal;

您可以使用以下小技巧更改联合的名称,而无需修改标题:

定义信号CCUCSIGNAL

包括

未定义信号


然后,您可以将counterCollectUnionContent.h中的联合称为CCUCSIGNAL,而另一个仍为SIGNAL

您可以使用以下小技巧更改联合的名称,而无需修改标题:

定义信号CCUCSIGNAL

包括

未定义信号



你可以参考反汇编中的联合作为.CUCUCK,而另一个仍然是信号< /P>为什么不把这两个标题放在不同的命名空间中?@保罗,好,我是C++的新手,我会挖出来怎么做,谢谢。@ PaulR,请你写下答案,如何做,在我的头文件里,我只想把这些部分分开,所有其他代码都应该共享。看起来MatthewMoss已经处理了这个问题。为什么不把这两个标题放在不同的命名空间中?@保罗,好,我是C++的新手,我会挖出来怎么做,谢谢。@ PaulR,请你写下答案,如何做,在我的头文件里,我只想把这些部分分开,所有其他代码都应该共享。看起来@MatthewMoss已经解决了这个问题。OP说他们无法更改这些头文件。感谢您的回答,我无法更改这两个头文件,我想我需要在头文件中创建名称空间,其中包括这两个头文件。编辑了我的答案。。。您应该能够使用名称空间包装include指令,但这可能在某种程度上取决于标题的内容。OP表示他们无法更改这些标题。感谢您的回答,我无法更改这两个标题文件,我想我需要在包含这两个头文件的头文件中创建名称空间。编辑我的答案。。。你应该能够用名字空间来包装包含指令,但是这可能取决于头文件的内容。宏是一个很差的解决方案。-名字空间对C++来说更有意义。我同意名字空间是C++中的首选解决方案。*,但是如果你不能编辑标题,并且包装包含指令就行不通了。这是一个很好的解决方案。对于C++,NAMSPESPACE更为合理。我同意名称空间是C++中的首选解决方案。*,但是,如果不能编辑头文件并包装包含指令将不起作用,那么这是一个选项。