【发布时间】:2011-09-16 03:34:44
【问题描述】:
如何使以下函数对 uint8_t、uint16_t、uint32_t、int8_t、int16_t、int32_t 和 float_t 通用?
我不喜欢在每种情况下都重复相同的逻辑,正如你所看到的。每种情况下的唯一区别是演员表。
理想情况下,我希望有一个符合 C 标准并因此具有可移植性的解决方案。欢迎任何想法。
谢谢。
static bool_t IsWithinLimits(const dbKey_t *key, const void *data)
{
bool_t isWithinLimits = TRUE;
limits_t limits = getDefinedLimits(key);
switch(key->type)
{
case TYPE_UINT8:
if((*(const UINT8*)data > (UINT8)limits.max) || (*(const UINT8*)data < (UINT8)limits.min))
{
isWithinLimits = FALSE;
}
break;
case TYPE_UINT16:
if((*(UINT16*)pData > (UINT16)limits.max) || (*(UINT16*)data < (UINT16)limits.min))
{
isWithinLimits = FALSE;
}
break;
case TYPE_UINT32:
...
break;
case TYPE_INT8:
...
break;
case TYPE_INT16:
...
break;
case TYPE_INT32:
...
break;
case TYPE_FLOAT:
...
break;
}
return isWithinLimits;
}
【问题讨论】:
-
这
*(UINT16*)pData > (UINT16)limits.Max怎么可能是真的? -
@Let_Me_Be:我猜
limits.max不一定总是65535! -
没错,每个键都有自己定义的最小/最大限制。
-
我想你误会了。问题是 UINT16 永远不会比 2^16-1 大,而 UNIT32 永远不会比 2^32-1 大,等等......
-
@Let_Me_Be:你的问题的答案是
*(UINT16*)pData > (UINT16)limits.max可以为真,例如,limits.max等于 7 并且*(UINT16*)pData大于 7。thegreendroid 不明白什么? 2^16-1 和limits.max有什么关系?
标签: c void-pointers type-punning