2015-12-28 35 views
0

我有一個像這樣的宏。在arm-linux-androideabi-gcc上使用c/C++宏的字符串化'#'

#define TO_STR(x) #x 

我可以用這個宏,使串字符沒有之間"輸入字符串。 像:

const char* test = TO_STR(hello,macro); 
std::cout << test << std::endl; 

我能搞到: hello,macro正確。

我的問題是:如何處理輸入字符串中的char #。 像:

const char* shaderprogram = TO_STR(#version 300 es \n); 

這將導致一個錯誤,任何建議?

+0

* 「這將導致一個錯誤」 * - 什麼你看到錯誤嗎?按照我的預期工作[這裏](http://coliru.stacked-crooked.com/a/476b8c47689d378d).... –

+1

如果'TO_STR'確實是'#define''d這樣,然後'TO_STR(你好,宏)'應該是不合格的.... – cpplearner

+0

@TonyD感謝您的回覆,我得到了'錯誤:無效的預處理指令#版本'。 – zh18

回答

1

第一個是不合格的,因爲預處理器會將,視爲分隔兩個參數,而不是參數的一部分。

你可以嘗試創建一個第二個宏

#define TO_STR2(a,b) TO_STR(a) "," TO_STR(b) 

然後,如果您想要做同樣的三個參數,你就需要定義另一個宏

#define TO_STR3(a,b,c) TO_STR2(a,b) "," TO_STR(c) 

這是可能的更多的參數,但混亂 - 畢竟,宏並不是真的打算用於這種事情。

的解決方案,二是容易

const char* shaderprogram = "#" TO_STR(version 300 es \n); 

真正的解決方案,但是,是從具有宏,讓你離開"字符掉字符串文字的任何癡迷脫身。只有當它是問題的唯一解決方案時纔在宏中使用字符串化運算符,而不是在有替代方案時選擇第一個工具。

畢竟,這

const char* shaderprogram = "#" TO_STR(version 300 es \n); // blech! 

不如

const char* shaderprogram = "#version 300 es \n"; 

由若干措施 - 包括可讀性,可維護性,等等等等

+0

感謝您的回覆,我應該改變一個例子,'''是我的錯誤,它應該是'const char * test = TO_STR(hello123);',但你已經指出了,這應該有助於其他人宏觀問題不健全。你有我的真正問題的解決方案。有用 。我們只需要照顧第一個字符'#',其他的宏在任何字符沒有問題之後。再次感謝 。 – zh18