是否必须在C和C++中转义制表符?

tgl*_*las 54 c c++

在C和C++(以及其他几种语言)中,字符和字符串常量中的水平制表符(ASCII代码9)以转义形式表示为'\t'"\t".不过,我经常键入字符串文字例如在转义字符制表"A B"(存在王全凯一个TAB AB),以及至少铛++似乎不打扰-字符串似乎等同于"A\tB".我更喜欢未转义的版本,因为长缩进的多行字符串在源代码中更易读.

现在我问自己这在C和C++中是否通常是合法的,或者只是由我的编译器支持.非字符表制表符在字符和字符串常量中的可移植性如何?

令人惊讶的是,我无法找到这个看似简单的问题的答案,无论是Google还是stackoverflow(我刚发现这个含糊不清的相关问题).

Mik*_*our 56

是的,您可以在字符串或字符文字中包含制表符,至少根据C++ 11.允许的字符包括(强调我的意思):

除双引号,反斜杠或换行符之外的源字符集的任何成员"\

(来自C++ 11标准,附件A.2)

源字符集包括:

空格字符,表示水平制表符,垂直制表符,换页符和换行符的控制字符,以及以下91个图形字符

(来自C++ 11标准,第2.3.1段)

更新:我刚刚注意到你问的是两种不同的语言.对于C99,答案也是肯定的.措辞不同,但基本上说同样的事情:

在字符常量或字符串文字中,执行字符集的成员应由源字符集的相应成员或[...]表示.

源和执行字符集都包含的位置

控制表示水平制表符,垂直制表符和换页符的字符.

  • @ Jarod42:的确,原始字符串文字可以包含源字符集中的任何内容,除了您为其选择的分隔符序列. (5认同)
  • @AndreasBonini:不,那不是源字符集的成员. (2认同)

ric*_*ici 27

将制表符直接放入字符串或字符文字中是完全合法的.C和C++标准要求源字符集包含制表符,字符串和字符文字可以包含源字符集中的任何字符,但反斜杠,引号或撇号(视情况而定)和换行符除外.

所以它是便携式的.但这并不是一个好主意,因为读者无法区分不同类型的空白.对于文本编辑器,邮件程序等来说,重新格式化标签也是很常见的,因此可以在这样的操作过程中将错误引入到程序中.

  • 同意"这不是一个好主意".假设源代码可以在一个字符串中嵌入一个原始回车符''\ r''(或垂直制表符,换页符),现在_those_会在代码清单中解密. (7认同)

Mar*_*c B 9

如果在输入中输入一个选项卡,那么你的字符串将包含一个文字制表符,它将保留一个制表符 - 它不会被神奇地翻译成\t内部.

编写代码同样如此 - 您可以在字符串中嵌入文字制表符.但是,考虑一下:

     T     T     T        <--tab stops
012345012345012345012345
foo1 = 'a\tb';
foo2 = 'a  b'; // pressed tab in the editor
foo3 = 'a  b'; // hit space twice in the editor
Run Code Online (Sandbox Code Playgroud)

除非你把光标放在之间的空白a,并b与检查多少个字符都在里面,基本上没有办法,以确定是否有在那里一个标签或实际空格字符.但随着\t版本,它立即显示为一个选项卡.

  • @Jongware:它发生在翻译阶段5,也就是说在预处理之后和相邻字符串文字的连接之前.("5.字符常量和字符串文字中的每个源字符集成员和转义序列都转换为执行字符集的相应成员;如果没有相应的成员,则转换为除null之外的实现定义成员(宽)字符.")知道是否有用是知识的一个功能:) (3认同)
  • "它不会被神奇地翻译成\ t内部" - 你碰巧知道什么时候`\ t`被翻译成一个标签,然后呢?(知道它是否真的是一个有用的事实.) (2认同)
  • 我的编辑器显示空白,空格和制表符非常明显 (2认同)