[英]Why the carriage return character is not considered as a white space character by the preprocessor
在 C 標准的第6.4 Lexical elements
節6.4 Lexical elements
中有寫
- ...預處理令牌可以用空格分隔; 這由注釋(稍后描述)或空白字符(空格、水平制表符、換行符、垂直制表符和換頁符)或兩者組成。
正如所見,回車符不包含在空白字符的概念中。
另一方面,在標准 C 函數isspace
的描述中有寫( 7.4.1.10 The isspace function
)
- ...標准的空白字符如下:空格 ('')、換頁符 ('\\f')、換行符 ('\\n')、回車 ('\\r') 、水平制表符 ( '\\t') 和垂直制表符 ('\\v')。 在“C”語言環境中, isspace 僅對標准空白字符返回 true。
是否有意在描述預處理的部分中未提及回車符,如果是,原因是什么?
或者這只是標准的缺陷?
相同的問題適用於 C++ 標准。
參見N1570 5.2.1 第 3 段。
回車符是基本執行字符集的成員(並且它被isspace()
視為空白字符),但它不是基本源字符集的一部分。
源和執行基本字符集都包括“空格字符,以及表示水平制表符、垂直制表符和換頁符的控制字符”。 另外,“在基本執行字符集中,應該有代表警告、退格、回車和換行的控制字符”。
在某些系統上,回車符是行尾指示的一部分; 任何此類指示都被視為單個換行符。 不是源文件中行尾指示符的一部分的回車字符會導致未定義的行為。
源文件輸入被翻譯成源字符集(標准第 5.1.1.2 節中的翻譯階段 1)。 源字符集在§5.2.1 中描述。
在 C.2011 中,§5.2.1¶3:
在源文件中,應該有某種方式來指示每行文本的結尾; 本國際標准將這樣的行尾指示符視為單個換行符。
裸回車不是源字符集的一部分。 如果它作為行終止序列的一部分出現,它會在 C 預處理器開始工作之前被翻譯成一個單獨的換行符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.