2015-10-05 96 views
2

在第2.10節中的C++標準14([lex.ppnumber]),預處理號碼被定義爲登錄預處理數量

pp-number 
    digit 
    . digit 
    pp-number digit 
    pp-number ' digit 
    pp-number ' nondigit 
    pp-number identifier-nondigit 
    pp-number e sign 
    pp-number E sign 
    pp-number . 

因此,這應包括所有整數文字令牌和所有浮動字面令牌。但是如2.14.4([lex.fcon])所寫,有一個符號是可選的,即(如果有一種方法可以像在標準中那樣格式化,可以隨意改進)。

exponent-part: 
    e sign_opt digit-sequence 
    E sign_opt digit-sequence 
sign: one of 
    + - 

爲什麼pp-number定義中的符號不​​是可選的?實際上,它的編寫方式是,數字1e3應該是浮動字面的,但不是pp-number,這與第2.10節給出的解釋相矛盾。

有什麼事我不明白?

+0

'1E3'是一個有效的pp號碼。 'E'使用標識符非數字製作。 –

回答

3

here從引用:

甲預處理數具有相當奇異定義。類別包括所有正常的整數和浮點常量 一個希望的C,也有一些其他的事情之一可能無法 最初承認的數字。在形式上,預處理號碼開始 帶有可選的句點,一個必需的十進制數字,然後用任何字母,數字,下劃線,句號和 指數序列繼續 。指數是兩個字符序列'e +','e-','E +', 'E-','p +','p-','P +'和'P-'。 (以「P」 或「P」開頭的指數是新的C99。它們用於十六進制浮點 常量。)

這個不尋常的定義的目的是給預處理從全隔離數字常量的複雜性。它確實 不必區分詞法有效和無效 浮點數,這是很複雜的。定義也 允許您在任何位置拆分標識符,並得到兩個 令牌,然後可以與'##'運算符一起粘貼。

預處理數字可能導致程序被誤解爲 。例如,0xE + 12是一個預處理號碼,其中 不會轉換爲任何有效的數字常量,因此語法 錯誤。這並不意味着0xE + 12,這可能是你想要的 。