У меня есть прямой код C в моем проекте Objective-C. В одном из API, которые я использую, я могу зарегистрироваться для обратного вызова с помощью функции, которая принимает 32-битный целочисленный параметр:
void Callback(Packet* packet, int32_t port);
Я хочу иметь возможность отправлять обратный вызов на два 16-битных порта вместо одного 32-битного порта. Естественно, я мог бы просто использовать побитовые операции, но я бы предпочел что-то более явное.
Вот мое текущее решение с союзом:
typedef struct {
int16_t port1;
int16_t port2;
} MultiPortStruct;
typedef union {
int32_t port;
MultiPortStruct portStruct;
} MultiPortAdaptor;
В отправителе:
void registerCallback(int16_t port1, int16_t port2) {
MultiPortAdaptor adaptor;
adaptor.portStruct.port1 = port1;
adaptor.portStruct.port2 = port2;
int32_t port = adaptor.port
RegisterAPICallback(&myCallback, port);
}
В обратном вызове:
void myCallback(Packet* packet, int32_t port) {
MultiPortAdaptor adaptor;
adaptor.port = port;
int16_t port1 = adaptor.portStruct.port1;
int16_t port2 = adaptor.portStruct.port2;
// do stuff
}
Правилен ли такой подход или с ним есть проблемы? (Например: следует ли обнулить объединения адаптеров? Можно ли обращаться к разным членам одного и того же объединения?) Есть ли более простой способ?
ОБНОВЛЕНИЕ:
Хорошо, я убежден: даже если это возможно, это, вероятно, не очень хорошая идея. Я решил просто использовать набор функций для выполнения побитовых операций за меня:
int32_t SubPortsToPort(int16_t port1, int16_t port2)
int16_t PortToSubPort1(int32_t port)
int16_t PortToSubPort2(int32_t port)
Итак, теперь все, что мне нужно сделать, это:
void registerCallback(int16_t port1, int16_t port2) {
int32_t port = SubPortsToPort(port1, port2);
RegisterAPICallback(&myCallback, port);
}
И в обратном вызове:
void myCallback(Packet* packet, int32_t port) {
int16_t port1 = PortToSubPort1(port);
int16_t port2 = PortToSubPort2(port);
// do stuff
}
Меньше кода, меньше забот!
c
здесь наиболее уместен. - person Archagon   schedule 09.08.2015recipient->(packet, adaptor.port);
недопустимо в C - person M.M   schedule 09.08.2015