当前位置: 首页 > 知识库问答 >
问题:

C++:多行字符串常量中的行尾是否有一个标准定义?

苍意智
2023-03-14

如果我有一个多行字符串C++11字符串常量,如

R"""line 1
line 2
line3"""

是否定义了行终止符/分隔符由什么字符组成?

共有1个答案

井修雅
2023-03-14

其目的是使原始字符串文字中的换行符映射到单个'\n'字符。这一意图没有得到应有的明确表达,导致了一些混乱。

引用的是2011年ISO C++标准。

首先,下面是它映射到单个'\n'字符的证据。

    const char *p = R"(a\
    b
    c)";
    assert(std::strcmp(p, "a\\\nb\nc") == 0);

第2.5节[lex.pptoken]第3段说(着重号为后加):

在原始字符串的初始和最终双引号字符之间,恢复在阶段1和2中执行的任何转换(三元图、通用字符名和行拼接);此回复应在任何D字符、R字符或限定括号被识别之前应用。

2.2[lex.phases]中规定了翻译的阶段。在第一阶段:

在原始字符串的初始和最终双引号字符之间,恢复在阶段1和2中执行的任何转换(三元图、通用字符名和行拼接);此回复应在任何D字符、R字符或限定括号被识别之前应用。

当然,将物理源文件字符映射到基本源字符集可以合理地认为是一种转换。带圆括号的子句“(三元图、通用字符名和行拼接)”似乎意在指定哪些转换要被还原,但这要么试图改变“转换”一词的含义(标准没有正式定义),要么与“任何”一词的用法相矛盾。

我认为,将“任何”一词改为“某些”将更清楚地表达明显的意图:

 类似资料:
  • 本文向大家介绍groovy 多行字符串(没有多余的尾随换行符),包括了groovy 多行字符串(没有多余的尾随换行符)的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 一、C++ 字符串 C++ 提供了以下两种类型的字符串表示形式: (1)C 风格字符串 (2)C++ 引入的 string 类类型 二、C 风格字符串 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用null字符\0终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。 下面的声明和初始化创建了一个RUNOOB字符串。由于在数组的末尾存

  • Standard C String & Character -> 详解 标准c字符和字符串 atof 语法: #include <stdlib.h> double atof( const char *str ); 功能:将字符串str转换成一个双精度数值并返回结果。 参数str 必须以有效数字开头,但是允许以“E”或“e”除外的任意非数字字符结尾。例如: x = atof( "42.0is_

  • 本文向大家介绍PowerShell中定义多行字符串变量的方法,包括了PowerShell中定义多行字符串变量的方法的使用技巧和注意事项,需要的朋友参考一下 本文介绍PowerShell中如何定义一个跨多行的字符串变量,定义多行字符串时使用@"开始,使用"@结束。 有没有遇到这样一种情况,我们想创建一个变量来保存一个跨行的字符串。 是不是对怎么输入很头疼啊?其它编程语言有没有办法我不知道,但在Pow

  • 问题内容: 测试字符串是否以子字符串结尾的标准PHP方法是: 这是最快的方法吗? 问题答案: 阿萨夫所说的是正确的。PHP中有一个内置函数可以做到这一点。 如果比PHP 长,则会发出警告,因此您需要首先进行检查。

  • 一、字符串操作<string.h> size_t strlen(char const* s); 注意:返回值类型size_t是无符号类型,和int进行运算或比较时需要注意; char* strcpy(char* dst,char const* src); 将src复制到dst,需保证dst有足够容纳src的空间,防止溢出,返回dst。若dst和src重叠,结果未定义 char* strcat(ch