2016-04-21 30 views
7

我想聲明一個靜態常量數組,其中包含帶有版本信息的字符串。C預處理器:字符串化不起作用

我已經有兩個版本號的宏,我想根據它生成一個初始的const字符串。

我正在嘗試使用here所描述的方法,但它不像預期的那樣可用編譯器工具。

我的代碼是未來:

#define API_VERSION_MAJOR 4 
#define API_VERSION_MINOR 47 

#define _STR(x) #x 
#define STR(x) _STR(x) 

static const char OSAPIVersion[] = 
    STR(API_VERSION_MAJOR) "." STR(API_VERSION_MINOR) ; 

當我打印的陣列,它的值是「API_VERSION_MAJOR.API_VERSION_MINOR」 的代替「4.47」

我使用定製的GCC 4.4.1 ARM交叉編譯器。

當我在我的PC上用Cygwin GCC 4.5.3做同樣的工作時,

非常感謝您的幫助。

UPDATE:

原來API_VERSION_MAJORAPI_VERSION_MINOR宏是在源文件中unvisible。我只是錯過了包括。很簡單。太簡單了,顯而易見。

請注意,在這種情況下沒有任何警告輸出。

+4

完全無關的問題,但不要使用具有前導下劃線和大寫字母的符號名稱,因爲這些名稱是爲「實現」(即編譯器和標準庫)保留的。 –

+3

剛剛在Ubuntu 12.04和14.04上嘗試了gcc 4.4,4.8和4.9,i386,x64和cross-arm的代碼片段 - 按預期工作(使用'compiler -E testfile.c')。我認爲問題在別的地方。這是編譯器/預處理器中的一個主要缺陷,否則就無法工作。 – Dummy00001

+0

從源文件複製並粘貼發佈的代碼? – LPs

回答

7

然後,您定製的GCC 4.4.1 ARM交叉編譯器是越野車。

如果您自己編譯它,有時會禁用某些過度激進的優化選項,這些優化選項可能並不能解決所有問題。

條條框框思考,你可能會調整的源代碼,以避免該問題:

#define API_VERSION_MAJOR "4" 
#define API_VERSION_MINOR "47" 
static const char OSAPIVersion[] = API_VERSION_MAJOR "." API_VERSION_MINOR; 

或可能構成串在運行時:

#define API_VERSION_MAJOR 4 
#define API_VERSION_MINOR 47 
static char OSAPIVersion[8]; 
int main(void) { 
    snprintf (OSAPIVersion, sizeof OSAPIVersion, "%d.%d", API_VERSION_MAJOR, API_VERSION_MINOR); 
}