在编写这个项目时,我遇到了这样一种情况:我有一个函数,它需要同时处理uint8、uint16和uint32变量。
我试图找到一个合适的解决方案来保持这种动态性,而不会造成太多混乱或大量重复代码,但最重要的是,有一个保存的解决方案。
在当前代码中,我使用具有union的结构作为函数的参数:

typedef struct
{
  DataType type;
  union
  {
    uint8_t uint8;
    uint16_t uint16;
    uint32_t uint32;
  } unsignedInt;
} anySizeUnsignedType;

这是为了使函数更具动态性,但是现在,我的函数中有两种类型,需要根据第三个变量对它们进行比较。
所以,这基本上就是我要做的:
anySizeUnsignedType Var1 = arg1;
anySizeUnsignedType Var2 = arg2;
uint8_t comparison = arg3;

switch (comparison)
{

    case ABOVE:

      if (Var1 > Var2 )
      {
        retValue = TRUE;
      }
      break;

    case EQUAL:

      if (Var1 > (Var2 - AnotherVar)
          && (Var1  < (Var2 + AnotherVar)))

      {
        retValue = TRUE;
      }
      break;

    case BELOW:
      if (Var1 < Var2 )
      {
        retValue = TRUE;
      }
      break;

    default:
      /* Should be impossible */
      break;

  }

问题是:我不能比较“Var”,因为它是一个结构当然,我需要比较uint8、uint16或uint32,但是有没有办法在不使用相同代码的情况下对所有3个无符号类型都保存3次呢?
或者总的来说有更好的解决方案吗?或者是不想这么做的原因?
我这样做的原因是:处理来自不同传感器的不同输出的传感器数据,并保持它们自己的官方分辨率,

最佳答案

我倾向于使用
int compare(uint32_t arg1, uint32_t arg2, uint8_t comparison)
作为(单个)函数,并依赖于arg1arg2的较窄版本的类型加宽。

10-08 07:11
查看更多