1

我正在尝试编写一些需要在浮点和定点环境中运行的 DSP 代码(数字类型将在编译时确定)。我想使用宏或 typedef 为特定的数字类型起别名。乘法、除法和其他数学函数在实现中会因数字类型而有很大差异,因此我需要某种开关来确定是否包含某些标头,并可能根据数字类型更改实现。

我将举一个简短的代码片段作为示例...

typedef samp_t float;
// or #define samp_t float (bad naming practice?)

// An alternative in fixed point
samp_t multiply_samp_t(samp_t a, samp_t b){
   return a*b;
}

/* typedef samp_t int;
#define RADIX 24
samp_t multiply_samp_t(samp_t a, samp_t b){
   return (samp_t) ((long) a)*((long) b) >> RADIX);
}
*/

void main(void){
  samp_t a,b,c;
   a = 15;
   b = 27;
   c = multiply_samp_t(a,b);
}

那么,如何根据 samp_t 的类型在两种不同的乘法函数之间切换呢?欢迎任何建议或建议。谢谢!-布兰特

4

1 回答 1

0

下面是一个在编译时选择与数据类型对应的函数的例子:

#define SYSTEM_FLOAT 0
#define SYSTEM_INT 1

// main selection
#define TYPE_SYSTEM FLOAT

#if TYPE_SYSTEM == SYSTEM_FLOAT
  #define SAMP_T float
  #define mult_samp_t   mult_samp_t_float
#elif TYPE_SYSTEM == SYSTEM_INT
  #define SAMP_T int
  #define mult_samp_t   mult_samp_t_int
#elif ...
#endif

void main(void){
  SAMP_T a,b,c;
   a = 15;
   b = 27;
   c = mult_samp_t(a,b);
}

您必须在代码中的某处定义:

float mult_samp_t_float(float a, float b)
{ 
  ...
  return a float;
}

float mult_samp_t_int(int a, int b)
{ 
  ...
  return an int;
}

也就是说,您选择的类型系统将设置您要使用的整个功能集。不过,我仍然建议仅在无法处理运行时选择和功能时才使用此方案,因为我在这里介绍的方式使代码更难调试(尽管我过去从未遇到过问题)。

(我在专业操作系统的代码中遇到了更糟糕的事情:-))

于 2012-04-23T21:48:13.497 回答