2015-03-17 4 views
1

В системе есть два файла заголовка, мне нужно включить эти два файла заголовка для взаимодействия с системой, два файла заголовка agentRegistrationUnion и counterCollectUnionContent.h эти два файла заголовок не содержат в себе ничего особенного, но только два объединения, но эти два союза имеет такое же имя, единственное различие заключается содержанием профсоюзов, профсоюзы выглядеть следующим образом:C++, возможно, иметь два объединения с одинаковым именем в разных файлах заголовков

union SIGNAL 
{ 
    struct s1  ss1; 
    struct s2  ss2; 
    ...... 
}; 

Я m не смог изменить эти файлы заголовков, когда я включил эти файлы заголовков, я получил 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; 

}; 
+5

Почему бы не разместить эти два заголовка в разных пространствах имен? –

+0

@PaulR Хорошо, я новичок в C++, я буду копать, как это сделать, спасибо. – user4016367

+0

@PaulR Не могли бы вы написать ответ, как это сделать, в моем заголовочном файле, я хочу только отделить все, все остальные коды должны быть разделены. – user4016367

ответ

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; 
+0

OP говорит, что они не могут изменить эти заголовки. –

+0

Спасибо за ответ, я не могу изменить два файла заголовка, думаю, мне нужно создать пространства имен в моих заголовочных файлах, которые включают эти два файла заголовка. – user4016367

+1

Отредактировано мои ответы ... Вы должны иметь возможность обернуть директивы '# include' с пространствами имен (но это может несколько зависеть от содержимого заголовков). –

1

Вы можете изменить название объединения без изменения заголовка с помощью следующей небольшой трюк:

#define SIGNAL CCUCSIGNAL

#include <counterCollectUnionContent.h>

#undef SIGNAL

Тогда вы можете обратиться к объединению в counterCollectUnionContent.h как к CCUCSIGNAL, а остальное - SIGNAL

+1

Макросы - это плохое решение для этого - пространства имен имеют больше смысла для C++. –

+0

Я согласен, что пространства имен являются предпочтительным решением в C++ ... *, но * если вы не можете редактировать заголовки и обернуть директивы '# include', это не будет работать, то это вариант. –

Смежные вопросы