In C and C++ (and several other languages) horizontal tabulators (ASCII code 9) in character and string constants are denoted in escaped form as '\t' and "\t". However, I am regularly typing the unescaped tabulator character in string literals as for example in "A B" (there is a TAB in betreen A and B), and at least clang++ does not seem to bother - the string seems to be equivalent to "A\tB". I like the unescaped version better since long indented multi-line strings are better readable in the source code.

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

令人惊讶的是,我找不到这个看似简单的问题的答案,既没有谷歌,也没有Stackoverflow(我只找到了this个模糊相关的问题).

推荐答案

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

source character set委员会的任何成员,但不包括 双引号"、反斜杠\或换行符

(附件A.2第C++11 standard页起)

源字符集包括:

空格字符、表示horizontal tab的控制字符、垂直制表符、换页符和换行符,外加以下91个图形字符

(从C++11 standard开始,第2.3.1段)

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

在字符常量或字符串文字中,执行字符集的成员应由source character set或[…]的相应成员表示

其中,源和执行字符集都包括

表示horizontal tab的控制字符、垂直制表符和 换页.

C++相关问答推荐

由于未签名int导致的运行时错误"

InetPton()函数无效的IP地址

是否有任何情况(特定类型/值),类型双关在所有符合标准的C实现中产生相同的行为?

使用额外的公共参数自定义printf

核心转储文件中出现奇怪的大小变化

在C中将通用字符名称转换为UTF-8

如何在C客户端应用程序的ClientHello消息中添加自定义扩展?

拥有3x3二维数组并访问数组[1][3]等同于数组[2][0]?

我的程序在收到SIGUSR1信号以从PAUSE()继续程序时总是崩溃()

为什么我会收到释放后堆使用错误?

当b是无符号字符时,int a=(b<;<;2)>;>;2;和int a=b&;0x3F;之间有什么区别?

';\n&39;和';\r&39;中的';\n&39;之间有什么关系?

为什么编译器不能简单地将数据从EDI转移到EAX?

如何使这个While循环在新行上结束

可以对两种 struct 类型中的任何一种进行操作的C函数

Tcl_GetDoubleFromObj在列表的迭代中是一个缺点

当读取可能会阻塞管道中的父进程时,为什么要等待子进程?

令人困惑的返回和 scanf 问题相关

我正在使用 klib 库 我可以使用 (khash) KHASH_SET_INIT_INT64() 负值作为键.因为我在头文件中看到它使用 unsigned long int

C 中 struct 体自赋值是否安全?特别是如果一侧是指向 struct 的指针?