【发布时间】:2015-08-09 03:28:29
【问题描述】:
我的 Objective-C 项目中有一些直接的 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++ 中是不允许的,但在 C 中是这样的。
-
仅使用按位运算,您的收益大约要好 10 亿倍。如果这让你感觉更好,你可以将它隐藏在一个内联函数后面。
-
技术上,我使用的是 Objective-C,所以我不确定哪个更合适。
-
那又是另一种语言,使用标签objective-c
-
然后发布您的实际 Objective C 代码?
标签: objective-c c struct bit-manipulation unions