簡體   English   中英

gcc和clang預處理器不了解L前綴

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM