2017-03-31 14 views
3

視爲空白characetr在那裏被寫入爲什麼回車符不被預處理

  • ...預處理標記的所述C標準的部分6.4 Lexical elements可以用空格隔開;這個由 評論(後述),或空白字符 (空間,水平製表,換行,垂直製表符,並形成進料),或者 兩者。
  • 因爲看到回車符不包含在空白字符的概念中。

    在標準C函數isspace的描述另一方面,存在被寫入(7.4.1.10 The isspace function

  • ...標準空白字符被以下:空間( ''),形式進料( '\ F'),新線( '\ n'),回車( '\ R'), 水平製表( '\ T'),和垂直製表( '\ v')。在「C」語言環境中, isspace僅對標準空格字符返回true。
  • 是不是故意的回車符是不是在描述預處理部分提到,如果這樣的原因是什麼?

    或者它只是標準的缺陷?

    相同的問題對於C++標準是有效的。

    +3

    否則,預處理器無法知道是哪裏的語句結束。這就是爲什麼\用於顯示它*在下一行繼續。 –

    +0

    請注意,§5.1.1.2翻譯階段包含步驟_1。物理源文件的多字節字符被映射,在一個實現定義 方式,到源字符集( 結束線指標引入新行字符)如果necessary._如果源文件具有CRLF行結束,此如果CRLF行末尾被源環境識別,則可以將這些行映射到換行符(LF)字符。因此,在Windows上,該映射是適當的。它在Unix上並不嚴格適用,但可以由一個慷慨的編譯器支持,可能在用戶從命令行選項的指導下進行。 –

    +0

    @WeatherVane預處理階段沒有聲明。如果你正在談論預處理指令,它們由換行符終止,沒有回車 –

    回答

    4

    參見N1570 5.2.1第3段。

    回車字符是基本執行字符集的成員(和它由isspace()視爲一個空白字符),但它不是基本的一部分源字符集。

    源和執行基本字符集都包括「空格字符,和表示水平製表符,垂直製表控制字符,和形式進料」。另外,「在基本執行字符集中,應該有代表警告,退格,回車和新行的控制字符」。

    在某些系統中,回車符是一個終端的線路的指示的一部分;任何這樣的跡象都被視爲單一的新行。回車符是而不是源文件中尾部指示符的一部分會導致未定義的行爲。

    +0

    什麼是從基本字符集不包括回車符的原因是什麼? –

    +1

    翻譯新文章不提供的來源的目的是什麼? – jxh

    +0

    @Keith Thompson這是預處理和C標準函數isspace的行爲之間的不一致。 –

    3

    源文件輸入被轉換爲源代碼字符集(在標準的§5.1.1.2翻譯階段1)。源字符集在§中描述5.2.1。

    在C.2011,§ 5.2。1 ¶ 3:

    在源文件,應當有指示 的每一行文本末尾的一些方式;本國際標準把這樣一個終點指標看作是一個單一的新行字符。

    裸回車不是源字符集的一部分。如果它作爲行終止序列的一部分出現,它將在C預處理器開始執行其工作之前被翻譯成單個新行。

    相關問題