2012-04-23 47 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