2013-01-18 29 views
2

我正在預處理我的InfoPlist文件以包含我的修訂版本號。我的標題是這樣的:如何在不插入空格的情況下將兩個宏與它們之間的點連接起來?

#import "svn.h" 

#define APP_VERSION 1.0 
#define APP_BUILD APP_VERSION.SVN_REVISION 

當我在程序中檢查我的Build版本,它是1.0 . 123456。但是,如果我試試這個:

#import "svn.h" 

#define APP_VERSION 1.0 
#define APP_BUILD APP_VERSION ## . ## SVN_REVISION 

我得到

error: pasting formed 'APP_VERSION.', an invalid preprocessing token 
error: pasting formed '.SVN_REVISION', an invalid preprocessing token 

我見過this question但它實際上並沒有給出答案; OP實際上並不需要連接令牌。我做。如何在不插入空格的情況下將兩個宏與它們之間的點連接起來?

回答

5

這個問題看起來像是由a quirk of the preprocessor引起的:對於連接運算符的參數沒有首先展開(或者......無論規則是否複雜),所以目前預處理器並不試圖連接1.0.,它實際上是試圖將APP_VERSION這個詞粘貼到輸出令牌中。單詞在C中沒有點,所以這不是一個有效的記號,因此是錯誤。

,這樣結合動作是隱藏的至少兩個取代落後,這樣你通常可以通過一對夫婦包裝宏層會生效的問題:

#define APP_VERSION 1.0 
#define SVN_REVISION 123456 

#define M_CONC(A, B) M_CONC_(A, B) 
#define M_CONC_(A, B) A##B 

#define APP_BUILD M_CONC(APP_VERSION, M_CONC(.,SVN_REVISION)) 

APP_BUILD // Expands to the single token 1.0.123456 

你很幸運在C預處理器編號is allowed to have as many dots as you like,即使C浮點常量可能只有一個。

+0

它顯示錯誤作爲無效後綴'.123456'浮動常數 – Abhishek

+0

@Abhishek你編譯還是隻是預處理?主要的C語言不能處理多點數字,所以您需要確保它們以字符串結尾或以其他方式隱藏。 – Leushenko

相關問題