2015-02-17 80 views
4

我見過this topic它做介紹了「字符串」操作:C預處理器:用前導零對字符串int進行處理?

#define STR_HELPER(x) #x 
#define STR(x) STR_HELPER(x) 

#define MAJOR_VER 2 
#define MINOR_VER 6 
#define MY_FILE "/home/user/.myapp" STR(MAJOR_VER) STR(MINOR_VER) 

是否有可能與前導零字符串化?比方說,我MAJOR_REV需要在這種情況下,兩個字符「02」和MINOR_REV 4個字「0006」 如果我做的:

#define MAJOR_VER 02 
#define MINOR_VER 0006 

的值將其他地方的應用被視爲八進制,這我不不想要。

+2

我的直覺是這將是足夠的硬度,即使升壓::預處理器,它是不是真的值得做。將「MAJOR_VER_STR」和「MINOR_VER_STR」定義爲帶前導零的字符串。你可以創建一個腳本來設置主版本和次版本以及匹配的字符串:'setversion --major = 2 --minor = 7 header.h'這個工作。 – 2015-02-17 21:39:20

+0

它可以用Boost.Preprocessor完成,但我相信你必須配合「插槽」才能做到這一點。如果初始數字格式不同,如主版本10的'#define MAJOR_VER(1)(0)',則可以更簡單地完成。 – 2015-02-18 01:49:38

+3

您是否需要使用預處理器?你不能爲它編寫常規的C代碼嗎?對不起,如果這是一個愚蠢的問題。 – 2015-02-18 09:27:39

回答

6

沒有乾淨,也沒有方便的方法來做到這一點。正如一個挑戰,在這裏一個可能的「解決方案」:含

1)創建一個頭文件(例如,「smartver.h」):

#undef SMARTVER_HELPER_ 
#undef RESVER 
#if VER < 10 
#define SMARTVER_HELPER_(x) 000 ## x 
#elif VER < 100 
#define SMARTVER_HELPER_(x) 00 ## x 
#elif VER < 1000 
#define SMARTVER_HELPER_(x) 0 ## x 
#else 
#define SMARTVER_HELPER_(x) x 
#endif 
#define RESVER(x) SMARTVER_HELPER_(x) 

2)在你的源代碼,無論你需要用前導零的版本號:

#undef VER 
#define VER ...your version number... 
#include "smartver.h" 

在這一點上,表達RESVER(VER)被擴展爲特點的四個數字序列,並表達STR(RESVER(VER))是等價的字符串(注:我用您發佈的STR宏在你回答)。

前面的代碼與您示例中次版本的大小寫匹配,修改它以匹配「主要版本」大小寫並不重要。但事實上,我會用一個簡單的外部工具來生成所需的字符串。

0

我相信問題提供的例子sprintf是正確的答案。

這就是說,有一些情況下你真的想這樣做,並用C預處理器,如果有一個願意和有人愚蠢,寫代碼通常是一種方式。

我寫了宏FORMAT_3_ZERO(a),它使用蠻力創建了一個三位零填充數字。它位於文件preprocessor_format_zero.h中,在https://gist.github.com/lod/cd4c710053e0aeb67281158bfe85aeef處找到,因爲它太大而且難以內聯。

用法示例

#include "preprocessor_format_zero.h" 

#define CONCAT_(a,b) a#b 
#define CONCAT(a,b) CONCAT_(a,b) 

#define CUSTOM_PACK(a) cp_ ## a __attribute__(\ 
     (section(CONCAT(".cpack.", FORMAT_3_ZERO(a))), \ 
     aligned(1), used)) 

const int CUSTOM_PACK(23);