2010-04-28 221 views
4

有人可以解釋爲什麼以下不起作用?C++翻譯階段混亂

int main() // Tried on several recent C++ '03 compilers. 
{ 
    #define FOO L 
    const wchar_t* const foo = FOO"bar"; // Will error out with something like: "identifier 'L' is undefined." 
    #undef FOO 
} 

我認爲預處理是在比字符串文字操作和通用記號翻譯更早的翻譯階段完成的。

豈不編譯器或多或少的看到這一點:

int main() 
{ 
    const wchar_t* const foo = L"bar"; 
} 

這將是巨大的,如果有人能舉出從標準的解釋。

回答

6

用途:

#define FOO L\ 

沒有尾隨\會有L與宏替換字符串之間的空格。這是從g++ -E結果:

const wchar_t* const foo = L "bar"; 
+0

當然!謝謝。實際上應該查看預處理過的輸出... – blakecl 2010-04-28 02:26:55

+2

確保在此定義和下一行之間留有空行,否則宏將繼續。過去我曾多次使用這種方法來製作多行宏。 – 2010-04-28 02:40:47

+1

請注意,這不適用於符合預處理器,因爲符合預處理器是基於令牌的。將兩個令牌合併爲一個(例如,「L」和「bar」)的唯一方法是使用連接運算符('##'),它不能作爲替換列表的最後一個符號出現。 – 2010-05-06 01:11:08

0

你得到它是預處理裝置的錯誤信息您#define之前它什麼都重要,它只是不知道它結束的意思(與L小號更換所有FOO年代後,它看起來什麼L意味着無法弄清楚)。

編譯器正在看到你的第二位代碼,它只是不知道L"bar"在這一點上的含義。

你確定所有的東西都被定義和包含在內嗎?

0

看看來自前處理(G ++ -E)輸出

# 1 "ttt.cc" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "ttt.cc" 
int main() 
{ 

    const wchar_t *const foo = L "FOO"; 
} 

有後是一個空格L.

1

作爲替代約翰的回答,我想你可以定義這個微軟的方式_T()的定義是:

#define FOO(x)  L ## x 

,並使用它像這樣:

FOO("bar") 

這將適當地連接L和文本。

+0

謝謝,我知道這件事。我已經使用了_T(和朋友),當遇到一些代碼時,偶然發現了這個「問題」。 – blakecl 2010-04-28 02:30:02