运行时的 C++ 字符串文字转换 [关闭]

Posted

技术标签:

【中文标题】运行时的 C++ 字符串文字转换 [关闭]【英文标题】:C++ string literal conversion at runtime [closed] 【发布时间】:2021-08-23 17:09:48 【问题描述】:

我有一个关于 C++ 中编译时与运行时字符串文字的问题。在编译时,创建一个字符串文字并(例如)传递给正则表达式处理器

  std::string pattern = "a\\d+"

导致“后编译”字符序列'a' '\' 'd' '+' '\0'

在运行时,用户通过命令行界面提供相同的“文字字符串”,例如通过键入(例如)

   set pattern 'a\\d+'

这会导致字符的“文字”序列'a' '\' '\' 'd' '+' '\0'

有没有办法使用或利用 C++ 用于将字符串的“编译时”表示转换为正确处理转义的实际 C++ 字符串表示的机制?

【问题讨论】:

为什么要让用户转义字符串? @MarkLavin C++ 也有这个功能(自 C++11 起)。请参阅en.cppreference.com/w/cpp/language/string_literal 处的“原始字符串”虽然,它显然只是编译时,因为 C++。 C++ 字符串文字有相当复杂的语法。有单字符转义序列、八进制转义序列、十六进制转义序列、通用字符名称、原始字符串,所有这些都以非平凡的方式相互交互。没有标准库函数来解释这种语法,因为它很复杂,而且在编写 C++ 代码之外通常没有用处。 OTOH 一个简化的语法可以用几行代码来完成,但是每个人都需要一个稍微不同的简化语法,所以这里也没有标准函数。自己写。 @n.1.8e9-where's-my-sharem。 -- C++ 有原始文字;如果您喜欢它们,请使用它们。 您误用了“文字”一词​​。在 C++ 中,literal 是嵌入源代码中 的常量值。 (虽然“字符串文字”是该术语最常见的用法,但它也适用于其他类型,例如“浮点文字”。)您在引用未嵌入源代码的内容时误用了该术语。特别是,用户无法在运行时提供文字。我认为您的问题很好,但您对术语的滥用使其看起来不那么重要。 【参考方案1】:

C++ 用于处理字符和字符串文字中的转义序列的机制是编译序列的Phase 5。这是内置在编译器链中的,在 C++ 中不可用。

如果您不使用 C++,大多数操作系统都提供了一种从程序内部调用外部命令的方法。如果这是可用的,并且如果您的用户的编译器(存在并且)提供了对源文件执行此单阶段翻译的选项,那么应该可以从用户那里读取字符串,调用外部程序并收集结果。我不知道有编译器提供此选项,但理论上是可能的。

另一方面,对于一项简单的任务来说,这似乎需要做很多工作。有十一个simple escape sequences。一个相当简单的扫描和替换可以处理它们。数字和通用转义序列需要更多的工作,但仍然不是很困难(特别是如果您决定您的用户不需要 C++ 程序员可用的所有选项)。在这一点上,我们似乎正在进入Convert string with explicit escape sequence into relative character 的领域,所以我将向您推荐该问题以获取更多信息。

【讨论】:

以上是关于运行时的 C++ 字符串文字转换 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中比较两个 std::string 时的未定义行为 [关闭]

将字符串转换为整数部分 C++ [关闭]

将 C++ 字符串操作转换为 C 的问题 [关闭]

连接相邻字符串文字时的 Python 运算符优先级

字符串函数不返回字符串? c++ [关闭]

C++ 多行字符串文字