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

在C和C ++(和其他几种语言)中,字符和string常量中的水平制表符(ASCII代码9)以转义forms表示为'\t'"\t" 。 但是,我经常在string文字中input非转义的制表符,例如在"A B" (betreen AB有一个TAB),至less铿锵声++似乎没有打扰 – 这个string似乎等同于"A\tB" 。 我更喜欢非转义的版本,因为在源代码中可以更好地阅读长缩进的多行string。

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

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

是的,至less根据C ++ 11,可以在string或字符文字中包含制表符。 允许的字符包括(我的重点):

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

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

源字符集包括:

空格字符,代表水平制表符 ,垂直制表符,换页符和换行符的控制字符加上以下91个graphics字符

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

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

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

源和执行字符集都包括在内

控制代表水平制表符 ,垂直制表符和换页符的字符。

将制表符直接放入string或字符文字是完全合法的。 C和C ++标准要求源字符集包含一个制表符,string和字符文字可以包含源字符集中的任何字符,除了反斜杠,引号或撇号(适当时)和换行符。

所以它是可移植的。 但这不是一个好主意,因为读者不可能区分不同types的空白。 文本编辑器,邮件程序等对标签进行重新格式化也是很常见的,所以在这样的操作过程中可能会将错误引入到程序中。

如果你在input框中input一个标签,那么你的string将包含一个字面标签字符,它将保留一个制表符 – 它不会被神奇地翻译成内部的\t

编写代码也是一样 – 你可以在你的string中embedded文字标签字符。 但是,请考虑这一点:

  TTT <--tab stops 012345012345012345012345 foo1 = 'a\tb'; foo2 = 'a b'; // pressed tab in the editor foo3 = 'a b'; // hit space twice in the editor 

除非你把光标放在ab之间a空白处,并且检查了那里有多less个字符,否则根本没有办法确定那里是否有一个制表符或实际的空格字符。 但是对于\t版本,它立即显示为一个选项卡。

当你按下TAB键时,你会得到你的系统映射关键的代码点。 该代码点可能是也可能不是程序运行的系统上的选项卡。 当你把\ t放在一个文字中时,编译器会用目标系统的合适的代码点replace它。 所以如果你想确保你在程序运行的系统上得到一个标签,使用\ t。 这是它的工作。