2017-08-23 23 views
1

我想用定義如何連接三個定義類型:string + number + string?

#define LOG_FLOAT_MARKER "%s%d.%010d" 

到construnct以下字符串到目前爲止,我有

#define EXP (10) 
    #define LOG_FLOAT "%s%d.%0" 
    #define D "d" 

我想創建這樣

#define LOG_FLOAT_MARKER LOG_FLOAT EXP D 

一個字符串,但沒有得到預期的產出,一些提示?

+0

只能連接*字符串*。 '(10)'不是一個字符串。下一次遇到宏問題時,請讓編譯器在預處理後停止,以便可以看到它將宏展開爲的內容。 –

+0

@Someprogrammerdude謝謝,然後我可以使用'#define EXP 10'來創建字符串,但是我不能將該定義用於數字用法,對吧? – ndarkness

+0

您可能正在尋找'*'說明符[http://en.cppreference.com/w/cpp/io/c/fprintf](http://en.cppreference.com/w/cpp/io/c/fprintf中)。 – ZDF

回答

4

對於EXP,您不能有(10),因爲您不希望括號成爲結果的一部分。

必須使用字串,以及一些箍跳:

#define EXP 10 

#define JOIN(a, b, c)  a #b c 
#define JOIN2(a, b, c)  JOIN(a, b, c) 
#define LOG_FLOAT_MARKER JOIN2(LOG_FLOAT, EXP, D) 

另外,我覺得使用命名只是D是自找麻煩的預處理器符號。

+0

感謝@unwind,所以最後一步'#define LOG_FLOAT_MARKER JOIN2(LOG_FLOAT,EXP,「d」)'會更好嗎? – ndarkness

+1

@ndarkness當然,或者將'D'重命名爲其他內容,或者只是對其進行硬編碼。 – unwind

+0

嗨@unwind,它似乎不工作,如果我打印'LOG_FLOAT_MARKER'我得到'%s%d。%0(10)d'而不是'%s%d。%010d' – ndarkness

1

我不知道我明白你想要做什麼。您可能正在尋找*符:

printf("%s%d.%0*d", "string", 1, 1, 1); // output: string1.1 
printf("%s%d.%0*d", "string", 1, 2, 2); // output: string1.02 
printf("%s%d.%0*d", "string", 1, 3, 3); // output: string1.003 

*一個完整的說明,請參見this

+0

謝謝@ZDF,但我不想使用printf進行優化 – ndarkness

相關問題