2010-03-25 60 views
5

我想讓我的項目在GCC下編譯(Visual Studio完美地編譯它)。GCC,Unicode和__FUNCTION__

我有一個自定義的assert函數,它會引發一個wstring消息。它的一部分是_ _FUNCTION__宏,我「unicodize」使用來自MSDN上擴大宏觀

#define WIDEN2(x) L ## x 
#define WIDEN(x) WIDEN2(x) 

它編譯於MSVC不錯,但它打印這GCC:

error: ‘L__FUNCTION__’ was not declared in this scope 

唯一我可以使用的解決方案是使用mbstowcs將__FUNCTION __的內容轉換爲運行時的wstring,但我希望找到一種編譯時的方式來完成它。

感謝您的幫助。

+0

你應該發佈你的'__FUNCTION__'宏。 – Gabe 2010-03-25 20:08:50

+1

我認爲它是由編譯自動提供的,至少MSVS會自動公開它。它甚至不允許我去定義,所以我不知道它是如何定義的。 – 2010-03-25 20:16:51

回答

5

在GCC __FUNCTION__是一個非標準的擴展。引述:GCC Online Docs

在GCC 3.3和更早的版本中,僅C, __FUNCTION____PRETTY_FUNCTION__被視爲字符串文字;他們可以用 初始化char 數組,並且可以將它們與其他字符串文字連接在一起 。 GCC 3.4 ,稍後將它們作爲變量處理, ,如__func__。在C++中,__FUNCTION____PRETTY_FUNCTION__總是有 變量。

因此,在__FUNCTION__的正面添加L只是將它變成L__FUNCTION__,這可能是未定義的。

+1

所以我想運行時轉換是唯一的方法? – 2010-03-25 20:28:56

+0

所以我做了運行時的方式。謝謝你的回答。 – 2010-03-27 10:39:08

+0

爲什麼他們改變了?在我看來,總是把它們當作字符串文字會更有幫助。 – antred 2015-05-18 16:00:35