2017-01-25 8 views
2

私は避けたいCコードにいくつかの冗長性があります。Cマクロの冗長性の回避

// Q15 macros 
#define SCALE_FACTOR_Q15 (0x00008000UL) 
#define Q15_MAX   (0x00007FFFUL) 
#define f32_Q15_x(x)  ((f32)(int) ((float)(x)*(float)SCALE_FACTOR_Q15)) 
#define f32_Q15_MAX  ((f32)  (Q15_MAX)       ) 
// etc... 

// Q31 macros 
#define SCALE_FACTOR_Q31 (0x80000000UL) 
#define Q31_MAX   (0x7FFFFFFFUL) 
#define f32_Q31_x(x)  ((f32)(int) ((float)(x)*(float)SCALE_FACTOR_Q31)) 
#define f32_Q31_MAX  ((f32)  (Q31_MAX)       ) 
// etc... 

今私はxが範囲[1,63]である他のQx、のためにおそらくQ25のコードの同じ平和を行い、将来的にする必要があります。

Qxごとにこれを別々に書くことを避けるにはどうすればよいですか?

答えて

7

これはいかがですか?

#define SCALE_FACTOR_Q(N) (1UL << N) 
#define Q_MAX(N)   (SCALE_FACTOR_Q(N) - 1) 
#define f32_Q_x(N,x)  ((f32)(int) ((float)(x)*(float)SCALE_FACTOR_Q(N))) 
#define f32_Q_MAX(N)  ((f32)Q_MAX(N)) 
+0

毎回「N」を指定しないようにするには、「#define f32_Q15_x(x)f32_Q_x(15、x) '? – Danijel

+0

すべての作品、多くのありがとう。 – Danijel