2012-04-23 49 views
1

我正在尝试编写一些需要在浮点和定点环境中运行的DSP代码(数值类型将在编译时确定)。我想使用宏或typedef别名特定的数字类型。根据数字类型的不同,乘法,除法和其他数学函数在实现上会有很大差异,所以我需要某种开关来决定是否包含某些头文件,并可能根据数字类型改变实现。检查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

下面是选择对应于在编译时的数据类型的功能的一个示例:

#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; 
} 

即,您选择的类型系统将设置您要使用的整个函数集。 但是,我仍然建议,只有在无法使用运行时选择和函数的情况下才使用此方案,因为我在此处介绍的方式会使代码更难调试(尽管过去我从来没有遇到过问题)。

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

+0

谢谢!这给了我一个如何进行的粗略想法。如果存在这样的事情,我希望看到一个typedef版本,尽管我怀疑它是否存在,因为检查typedef的存在是不可能的(据我所知)。 – user1352331 2012-05-02 05:33:19