在C和C ++(以及其他几种语言)中,字符和字符串常量中的水平制表符(ASCII代码9)以转义形式表示为'\t'
和"\t"
。但是,我经常在字符串文字中键入未转义的制表符字符,例如在"A B"
中(在betreen A
和B
中有一个TAB),并且至少clang ++似乎没有麻烦 - 字符串似乎等同于"A\tB"
。我更喜欢未转义的版本,因为在源代码中,长缩进的多行字符串更易读。
现在我问自己这在C和C ++中是否通常是合法的,或者只是由我的编译器支持。非字符表制表符在字符和字符串常量中的可移植性如何?
令人惊讶的是,我无法找到这个看似简单的问题的答案,无论是Google还是stackoverflow(我刚发现this模糊相关的问题)。
答案 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
除非您将光标放在a
和b
之间的空白处并检查其中有多少个字符,否则基本上无法确定是否有标签或实际空格字符在那里。但是对于\t
版本,它会立即显示为标签。
答案 3 :(得分:2)
当您按TAB键时,您将获得系统将该键映射到的任何代码点。该代码点可能是也可能不是程序运行的系统上的选项卡。当您将\ t放在文字中时,编译器会将其替换为目标系统的相应代码点。因此,如果您想确保在程序运行的系统上获得一个选项卡,请使用\ t。这是它的工作。