2012-11-26 26 views
0

C99標準,並具有鬧明白這一點:預處理器中的Placemarker和非地標標記?

c99 - 6.10.3.3 
Semantics 
3 

---(第二句)

Placemarker preprocessing tokens會被特殊處理:兩個地點標記導致單個placemarker預處理標記和級聯串接地點標記 與non-placemarker preprocessing token導致非地標標記預處理令牌。

如果結果不是有效的預處理標記,則行爲未定義。

1.What does this `placemarker` and `non-placemarker` term mean exactly? 
2.Why the last line says : `undefined behaviour` ? 

我讀了10次以上,但仍然對這些技術名稱感到困惑。

任何幫助例子和小解釋將幫助我更多。

回答

2

Placemarker令牌在前面的段落(6.10.3.2)中所定義:

如果在一個函數宏的替換列表,一個參數被立即之前 或後跟一個##預處理標記,該參數被替換爲相應的參數的預處理令牌序列;但是,如果參數不包含 預處理標記,則該參數將替換爲地標標記而不是預處理標記 。 145)

而且註腳:

145)Placemarker預處理標記不會出現在語法,因爲它們是 僅存翻譯階段臨時實體4.

而你引用的最後一行不會說「未定義的行爲」,它說「行爲未定義」。我不確定你在這裏尋找什麼樣的答案。它是這樣說的,因爲標準的作者決定如此。

+0

是的,這很好,你已經引用了,但我的問題很清楚,什麼是placemaker和非placemaker令牌。它只是寫成:'「但是,如果一個參數不包含預處理標記,則該參數會被替換爲地標標記預處理標記,而不是」「,但它對於placemaker沒有任何說明。 – Omkant

+0

也''行爲是未定義的''和'「未定義的行爲」'他們是不同的? – Omkant

+1

首先,它是「placemarker」,而不是「placemaker」。其次,就是這樣:一個特殊的標記,用於標記不包含令牌的參數在哪裏展開。 – melpomene