C++中为什么必须对字符串字面量中的反斜杠进行转义?

4

我希望为两种语言声明相同的正则表达式模式。对于TCL,我会这样做:

set pattern "\d\s\S" 

但对于C++,我必须使用相同的模式进行操作。
boost::regex pattern("\\d\\s\\S");

否则,C ++编译器将告诉我们以下内容:
warning C4129: 'd' : unrecognized character escape sequence

为什么TCL不尝试寻找\d \s \S转义符,而只是忽略\,但C++却尝试并失败了?

P.S. 我记得PHP的工作方式与TCL相似。


2
这是与编程语言特定相关的。一些语言像 C++,C,Java 需要你双倍转义。而其他一些语言如 - Perl,PHP 不需要。 - Rohit Jain
如果您正在使用支持C++11的编译器,您可以使用新的原始字符串字面量。请参见http://en.wikipedia.org/wiki/C%2B%2B11#New_string_literals。 - Michael
2
这个问题与PHP或TCL无关,它完全是关于C++的。仅仅因为它提到了PHP和TCL并不意味着它应该出现在那些类别中,因为PHP或TCL专家无法回答这个问题。 - deceze
我不这样认为。而且,我认为TCL或PHP专家可以很好地知道为什么当你执行 set a "\dumb" 时,它会被解释为 dumb。这个原因对我来说已经足够了,我也能理解为什么在C++中不是这样的。 - Narek
1
@Narek - C++ 设计者(或实际上是 C)选择将 "\dumb""\thumb" 视为相同,因为他们认为否则会令人困惑。 - Bo Persson
是的,也许这就是原因! - Narek
2个回答

4
这就是C++和PHP之间的区别;在PHP中,反斜杠后面的字符将与一小组特殊字符(我相信是"rnvtx")匹配。如果匹配失败,它将继续而不会改变意义。
然而,在C++中,期望该字符属于那个小组(我认为这个集合更大),但如果匹配失败,你会看到一个错误。

1

C++有字符转义序列的概念。转义序列采用\c(其中'c'是一个字符)的形式,用于在字符串字面值中定义某些特殊字符,因此单独的反斜杠也必须进行转义,以表示不暗示特殊字符。


PHP采用了略微不同的规则,但概念类似。至于TCL,它具有出色的Unicode支持,实际上可以处理不可打印的字符,而无需使用转义序列。 - Ian Atkin
Tcl肯定有转义序列,但它也有一种语法(用大括号)来表示未替换的单词。(原始问题不起作用 - 在Tcl中,“\d\s\S”与“dsS”相同 - 但“{\d\s\S}”是可以的。) - Donal Fellows

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接