检查typedef别名的值

时间:2012-04-23 21:32:58

标签: macros switch-statement signal-processing typedef numeric

我正在尝试编写一些需要在浮点和定点环境中运行的DSP代码(数字类型将在编译时确定)。我想使用Macro或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的类型在两个不同的乘法函数之间切换?欢迎任何建议或建议。 谢谢! -Brant

1 个答案:

答案 0 :(得分: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;
}

也就是说,您选择的类型系统将设置您将要使用的整个功能集。 但是,我仍然建议只在你不能使用运行时选择和函数时使用这个方案,因为我在这里介绍的方式使代码更难调试(尽管我以前从来没有遇到过它的问题)。

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