Я думаю, что структура заголовка в объединении является общим префиксом переменных.поэтому вы можете проверить тип этого объединения следующим образом:
switch(data_p->header.type) {
case 1:
printInfo(data_p);
case 2: //unknown type?
printInfo(data_p);
case 3: // type is obviously signal2
data_p->signal2->something[5];
}
Так что да, вы можете проверить с помощью data_p-> header.type.мне кажется, что вы могли бы немного переписать код, чтобы сделать его более очевидным
enum {
HEADER_TYPE = 1, // fill in the correct type numbers here to match the documentation
SIGNAL1_TYPE = 2,
SIGNAL2_TYPE = 3
};
switch(data_p->header.type) {
case 1:
printInfo(data_p);
case 2: //unknown type?
printInfo(data_p);
case SIGNAL2_TYPE: // type is obviously signal2
data_p->signal2->something[5];
}
другая вещь, которую я заметил в заголовке printInfo
, не имеет переменной примитив из оператора switch, который вы бы сделалиДля правильного вызова используйте printInfo(data_p)
.
Самое важное здесь заключается в том, что программист должен убедиться, что переменная типа всегда установлена на правильное значение, соответствующее правильной структуре части объединения,т. е. если структура представляет собой сигнал1, его 1, а если это сигнал2, то его 2 и т. д.
Но использование объединения здесь совершенно бесполезно, поскольку все поля идентичны, кроме последнего, а заголовокочевидно предназначенный для доступа к общим полям.
struct Header
{
int type:
int protocol;
int clientId;
int serverId;
};
struct Signal1
{
struct Header header;
int[80] something;
};
struct Signal2
{
struct Header header;
int[100] something;
};
enum {
SIGNAL1_TYPE = 0,
SIGNAL2_TYPE
};
void service(struct Header* data_p) {
switch(data_p->header.type) {
default:
printInfo(data_p);
break;
case SIGNAL1_TYPE:
/* your code here */
call_func( (struct Signal1 *) data_p );
break;
case SIGNAL2_TYPE:
/* your code here */
call_func( (struct Signal2 *) data_p );
break;
}
}