2014-06-09 66 views
1

我試圖定義C預處理器替換和串聯

#define tokenBits 32 
typedef inttokenBits_t Token; 
typedef int#tokenBits#_t Token; 
typedef int##tokenBits##_t Token; 
typedef int###tokenBits###_t Token; 
const tokenBase=numeric_limits<Token>::min() 

我應該如何才能確定它得到

typedef int32_t Token; 

如果恰好寫的#define運作的方式(我發現文本都沒有給出完整的視野)。

+1

#和##運算符只能用於#define預處理器語句中,而不能用於普通代碼中。 –

+0

這些宏真的很糟糕,任何理由使用你的'define',而不是純粹的typedefs? – quantdev

+0

我想在一點上改變令牌的大小。 –

回答

1

使用宏:

#define BIT_AWARE_TYPEDEF(bitness, type, result) typedef type##bitness##_t result; 

較少的可配置性:

#define TOKEN(bitness) typedef int##bitness##_t Token; 
+0

更簡單些? –

+0

@GeorgeKourtis:見編輯。 – erenon

3

我的建議:

#define CONCAT(a,b,c) a ## b ## c 
#define MYINT_TYPE(tokenBits) CONCAT(int, tokenBits, _t) 

typedef MYINT_TYPE(tokenBits) Token; 
+0

@chris我覺得很容易閱讀和清除。它有什麼缺點? – Shoe

+0

@Jefffrey,只是提出了爲什麼它存在(它有一個目的)的問題,除了我太累了,它實際上是必需的,因爲'tokenBits'是一個宏。 – chris

+0

@Jefffrey感謝您的編輯。 –

0

使用模板:

template <std::size_t N> struct sized_int; 

template<> struct sized_int<32> { using type = int32_t; }; 
template<> struct sized_int<64> { using type = int64_t; }; 

#define tokenBits 32 

using Token = typename sized_int<tokenBits>::type;