运行时的 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++ 字符串文字转换 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章