2014-03-02 49 views
1

在我的代碼版本號在幾個格式要求我改變多個定義,當我在版上定義:C預處理 - 使用定義爲整數,如寬字符串

#define VERSION_N  0x0203 
#define SERIALNUMBER_STR L"2.0.3" 

等等。

我想集中到一個單一的定義。 喜歡的東西:

#define VER_X_ 0 
#define VER_H_ 2 
#define VER_M_ 0 
#define VER_L_ 3 

#define VERSION_N VER_L_ + 0x10*VER_M_ + 0x100*VER_H_ + 0x1000*VER_X_ 
#define SERIALNUMBER_STR ?????????????? 
+0

您應該在宏體的周圍放置括號以防止由於擴展站點上的運算符優先級而導致的意外。即'2 * VERSION_N'會給你錯誤的結果,因爲'*'的優先級高於'+',所以它只會將'VER_L_'乘以'2'。 – pat

+0

@pat有趣。應該放在最後的解決方案,儘管對我來說無關緊要。 TX。 – Shaul

+0

誰開始迷戀宏名稱中的尾部下劃線? – Jens

回答

0

這裏的測試解決方案:

#define VER_X_ 0 
#define VER_H_ 2 
#define VER_M_ 0 
#define VER_L_ 3 



#define VERSION_N (VER_L_ + 0x10*VER_M_ + 0x100*VER_H_ + 0x1000*VER_X_) 

// Device Strings 
// 
#define STRINGIFY_1(x) L#x 
#define STRINGIFY(x)  STRINGIFY_1(x) 
#define PASTE(x, y) x##y 
#define MAKEWIDE(x) PASTE(L,x) 

#define SERIALNUMBER_STR MAKEWIDE(STRINGIFY(VER_H_)) L"." \ 
         MAKEWIDE(STRINGIFY(VER_M_)) L"." \ 
         MAKEWIDE(STRINGIFY(VER_L_)) 

由於ouah

編輯:

  1. 添加按照pat。括號。
  2. 瓦伊的言論被認真對待。適用於MS的解決方案:添加兩個PASTE & MAKEWIDE
+0

請參閱我的答案中的寬字符串編輯,您不應該使用'L#x'。 – ouah

+0

只是我的個人品味,但我發現原始的兩個宏**以任何方式更好**。你最終會遇到很多混淆。 – Jens

1

使用字符串化宏:

#define STRINGIFY_1(x...) #x 
#define STRINGIFY(x...)  STRINGIFY_1(x) 

#define VER_X_ 0 
#define VER_H_ 2 
#define VER_M_ 0 
#define VER_L_ 3 

#define SERIALNUMBER_STR STRINGIFY(VER_H_) L"." STRINGIFY(VER_M_) \ 
          L"." STRINGIFY(VER_L_) 

EDIT1:L"."添加L有寬字符串。我沒有放置L#x,因爲它具有空間擴展,並且L "string"不是C中的字符串文字。儘管連接字符串和寬字符串會導致寬字符串文字。如上所述,上述示例使用C(c99和c11)的最新版本,但不使用c89(即不使用MSVC)。第一個原因是在c89中不支持可變宏。第二個原因是在c99中可以連接字符串文字和寬字符串,但在c89中這是未定義的行爲。下面是一個標準的解決方案,在C89也行:

#define CAT(x, y) x##y 
#define WIDE(x) CAT(L,x) 

#define STRINGIFY_1(x) #x 
#define STRINGIFY(x)  STRINGIFY_1(x) 

#define VER_X_ 0 
#define VER_H_ 2 
#define VER_M_ 0 
#define VER_L_ 3 

#define SERIALNUMBER_STR WIDE(STRINGIFY(VER_H_)) L"." WIDE(STRINGIFY(VER_M_)) \ 
          L"." WIDE(STRINGIFY(VER_L_)) 
+0

不編譯。 也許不支持MS(我使用的是Build 6.0) 另外,我需要一個**寬** char字符串。 – Shaul

+1

@Shaul MSVC不支持c99,刪除宏中的'...',它將與MSVC一起使用。 – ouah

+0

MS沒有接受這個改變。錯誤消息是:錯誤C2308:連接不匹配的字符串。 – Shaul