[英]gcc and clang preprocessor doesn't understand L prefix
假設此代碼:
enum class Foo
{
One,
Two,
Three,
Four,
Five
};
#define HANDLE_FOO(f) case Foo::f: std::wcout << L#f << std::endl;
Foo x = Foo::Five;
switch (x)
{
HANDLE_FOO(One);
HANDLE_FOO(Two);
HANDLE_FOO(Three);
HANDLE_FOO(Four);
HANDLE_FOO(Five);
}
msvc編譯正確,但是gcc給出此錯誤:“在此作用域中未聲明'L'”
因此,問題是:如何解決該問題? 不僅'L'前綴不起作用,而且'u'等等也不起作用。
這段代碼可以很好地編譯:
std::wstring str = L"This is a string";
先感謝您。
我認為該構造無效,MSVC應該對其進行診斷。
#
運算符將其參數“字符串化”,因此One
變為"One"
,但是通過在L
之前加上L
您將獲得兩個單獨的標記L
和"One"
。
您想要的是單個令牌,字符串文字L"One"
。 您需要使用##
粘貼令牌運算符以及#
字符串化運算符:
#define HANDLE_FOO(f) case Foo::f: std::wcout << L ## #f << std::endl;
實驗表明,這適用於g ++ 5.3.0和clang ++ 3.6。
用GCC的-E
選項檢查后, L
前綴和代碼中的字符串之間產生了一個空格,我猜該空格是有害的。
此代碼使用##
運算符來連接已工作的令牌:
#include <iostream>
enum class Foo
{
One,
Two,
Three,
Four,
Five
};
#define HANDLE_FOO(f) case Foo::f: std::wcout << L## #f << std::endl;
int main(){
Foo x = Foo::Five;
switch (x)
{
HANDLE_FOO(One);
HANDLE_FOO(Two);
HANDLE_FOO(Three);
HANDLE_FOO(Four);
HANDLE_FOO(Five);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.