在 C 中方便地声明编译时字符串
在编译时创建和操作字符串可能是 C 中的一个有用工具。然而,当前声明编译时字符串的过程很麻烦,需要使用可变的字符序列。这就引出了一个问题:是否有更方便的方法来在 C 中声明编译时字符串?
现有方法及其局限性
理想情况下,我们希望声明编译时字符串的语法如下:
using str1 = sequence<"Hello, world!">;
或者,我们可以使用用户定义的文字:
constexpr auto str2 = "Hello, world!"_s;
但是,str2 的声明类型缺少 constexpr 构造函数,并且由于指向成员的指针复杂性,用户定义的文字方法不可行。此外,尝试使用 constexpr 函数来实现此目的会遇到数组或字符串参数不是 constexpr 类型的问题。
建议的解决方案和当前状态
虽然当前没有专门解决方便的编译时字符串声明问题的提案或语言功能,但 Scott Schurr 在 C Now 上提出了 str_const 实用程序2012。这个实用程序虽然需要 constexpr 功能,但提供了一个非常优雅的解决方案,如下所示:
int main() { constexpr str_const my_string = "Hello, world!"; static_assert(my_string.size() == 13); static_assert(my_string[4] == 'o'); constexpr str_const my_other_string = my_string; static_assert(my_string == my_other_string); constexpr str_const world(my_string.substr(7, 5)); static_assert(world == "world"); // constexpr char x = world[5]; // Does not compile because index is out of range! }
C 17 更新
随着 std 的引入: :C 17 中的 string_view,可以使用 str_const 的更好替代方案。上面的代码可以重写如下:
#include <string_view> int main() { constexpr std::string_view my_string = "Hello, world!"; static_assert(my_string.size() == 13); static_assert(my_string[4] == 'o'); constexpr std::string_view my_other_string = my_string; static_assert(my_string == my_other_string); constexpr std::string_view world(my_string.substr(7, 5)); static_assert(world == "world"); // constexpr char x = world.at(5); // Does not compile because index is out of range! }
这种方法提供了编译时字符串操作功能和超出范围的检查。
以上是有没有更方便的方法在 C 中声明编译时字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!