2012-12-10 17 views
3

關於下劃線名稱的問題部分回答了here,,但答案不完整,或者我沒有完全理解。下劃線,名稱和文字運算符

Sect。在C++ 11標準的2.14.8.7聲明此字面操作者作爲一個例子:

long double operator "" _w(long double); 

除了聲明操作中,標準及其實施例做進一步的兩件事情是,如果單獨看,每個有意義:

  • 它開始名稱_w帶下劃線;和
  • 它將運算符放在全局名稱空間中。

我的問題有兩個部分:

  1. 根據the answer linked above,名稱_w不是標識符,或標識_w是不是一個名,或...好,我是米困惑。
  2. 如果_w沒問題,那麼大寫的_W也可以 - 60.0_W,意思是60.0瓦特?還是預處理器可能會錯誤地處理大寫的版本?

毫無疑問,和你一樣,我不習慣用下劃線開始全局名稱,這是習慣標準教派的習慣。 17.6.4.3.2.1顯然似乎不贊成。因此,如果您可以對下劃線,名稱和文字操作符進行一些更多的說明,則可以欣賞燈光。

+1

'_W'會引起麻煩,作爲一個'#定義_W/* *什麼/'之前字面經營者的定義會導致'_W'到被替換。這不是'_W'中的'_W'被保留,但是實現可能像上面那樣有一個宏'_W'。現在,人們可能會懷疑標準是否真的允許在字面操作符標識符上進行宏替換,並且我會說是,因爲'_W'是一個單獨的預處理器標記。 – Xeo

+0

@Xeo:謝謝。你碰巧知道標準中的哪個地方解釋說'_W'會引起麻煩嗎?如果是這樣,我想閱讀該部分。 – thb

+2

對於預處理階段/標記,大多是子條款2.2和2.5。 '_W'是一個*標識符*,因此它是一個*預處理標記*,如果它命名一個宏,它將在階段4中展開。 – Xeo

回答

10

好的,我從Clang團隊的Richard Smith那裏查了一下,你的文字操作符中的_W部分確實不是一個保留的標識符和/或名稱,它也是一個單獨的預處理器標記,如果它命名一個宏。這符合標準的第2.5節,其中標識符預處理器令牌和2.2,其在作爲階段4的一部分的宏擴展之前,預處理器令牌被替換爲語言語法的令牌,其中發生在階段7.

他還提到,since the Portland meeting of the committee,你可以說operator""_W,這將防止宏擴展,因爲_W不再是一個單一的標識符。鏘幹線已經實現了這一點,並編譯下面的代碼片段:

#define _W _x 

int operator""_W(unsigned long long){ return 42; } 

int main(){ 
    int i = 1337_W; 
} 
+0

這會工作_string literals_以及請問'「1337」 _W'工作或不預處理認爲這是兩個不同的令牌 –

+2

@ K-BALLO:??記住,問題與用戶定義文字的字面ooerator的用法不同,它是'_W'被替換的聲明。 – Xeo