我正在尝试编写一些需要在浮点和定点环境中运行的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
答案 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;
}
也就是说,您选择的类型系统将设置您将要使用的整个功能集。 但是,我仍然建议只在你不能使用运行时选择和函数时使用这个方案,因为我在这里介绍的方式使代码更难调试(尽管我以前从来没有遇到过它的问题)。
(我在专业操作系统的代码中遇到了更糟糕的事情:-))