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

时间:2015-03-06 14:26:27

标签: c++ c

在C和C ++(以及其他几种语言)中,字符和字符串常量中的水平制表符(ASCII代码9)以转义形式表示为'\t'"\t"。但是,我经常在字符串文字中键入未转义的制表符字符,例如在"A B"中(在betreen AB中有一个TAB),并且至少clang ++似乎没有麻烦 - 字符串似乎等同于"A\tB"。我更喜欢未转义的版本,因为在源代码中,长缩进的多行字符串更易读。

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

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

4 个答案:

答案 0 :(得分:56)

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

  

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

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

和源字符集包括:

  

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

(来自C++11 standard,第2.3.1段)

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

  

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

的相应成员表示

源和执行字符集都包括

  

控制代表水平标签,垂直标签和字符的字符   形式饲料。

答案 1 :(得分:27)

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

所以它是便携式的。但这并不是一个好主意,因为读者无法区分不同类型的空白。文本编辑器,邮件程序等重新格式化选项卡也很常见,因此在这些操作过程中可能会将错误引入程序。

答案 2 :(得分: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

除非您将光标放在ab之间的空白处并检查其中有多少个字符,否则基本上无法确定是否有标签或实际空格字符在那里。但是对于\t版本,它会立即显示为标签。

答案 3 :(得分:2)

当您按TAB键时,您将获得系统将该键映射到的任何代码点。该代码点可能是也可能不是程序运行的系统上的选项卡。当您将\ t放在文字中时,编译器会将其替换为目标系统的相应代码点。因此,如果您想确保在程序运行的系统上获得一个选项卡,请使用\ t。这是它的工作。