首页 > 后端开发 > C++ > 如何在 C 中简洁地声明编译时字符串?

如何在 C 中简洁地声明编译时字符串?

Barbara Streisand
发布: 2024-12-10 02:24:10
原创
1040 人浏览过

How Can I Concisely Declare Compile-Time Strings in C  ?

在 C 中声明编译时字符串

简介
在 C 中,声明编译时字符串,在整个编译过程中保持不变,可能会很麻烦。传统方法需要指定可变字符序列:

using str = sequence<'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!'>;
登录后复制

现有方法:挑战和限制
理想情况下,声明编译时字符串应该更简单,例如:

using str1 = sequence<"Hello, world!">;
constexpr auto str2 = "Hello, world!"_s;
登录后复制

然而,这些方法面临着障碍:

  • 方法 1 需要具有外部链接和复杂实现的数组。
  • 方法 2 使用用户定义的文字,由于输入的非 constexpr 性质而具有挑战性参数。
  • Constexpr 函数不能接受非 constexpr 数组,因为

解决方案:str_const 库
Scott Schurr 在 C Now 2012 上的演讲中,str_const 库提供了一个方便的解决方案:

constexpr str_const my_string = "Hello, world!";
static_assert(my_string.size() == 13);
static_assert(my_string[4] == 'o');
constexpr str_const world(my_string, 7, 5);
static_assert(world == "world");
登录后复制

该解决方案提供了 constexpr 范围检查和灵活的子字符串检索等优点,而无需

更新:C 17 和 std::string_view
在 C 17 中,std::string_view 提供了类似的解决方案:

constexpr std::string_view my_string = "Hello, world!";
static_assert(my_string.size() == 13);
static_assert(my_string[4] == 'o');
constexpr std::string_view world(my_string.substr(7, 5));
static_assert(world == "world");
登录后复制

这种方法提供以下优点:

  • 无需自定义库或宏。
  • 使用 .at() 或 .substr() 进行范围检查。
  • 可以用作 const 参数类型。

以上是如何在 C 中简洁地声明编译时字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板