在编译时评估 strlen?

Evaluating strlen at compilation time?

本文关键字:strlen 评估 编译      更新时间:2023-10-16

如果我的代码有这个constexpr字符串

constexpr char my_str[] = "hello";

my_str的类型包含有关其大小的信息,即sizeof(my_str)是一个常数 6,可以在任何需要常量的地方使用。

strlen(my_str)呢?是否可以/是否也应该将其计算为编译时常量?

下面是一个 yes 的示例:https://ideone.com/2U65bN

下面是一个 no 的示例:http://coliru.stacked-crooked.com/a/8cb094776dfc5969

《标准》对此有何规定?肯定不是"也许"吗?

在 C++17 中,您可以使用std::char_traits::length,这是constexpr,而不是strlen

标准中的

21.8,1和2说:

  1. 表 74、75、76、77、78 和 79 描述了标头<cctype><cwctype><cstring><cwchar><cstdlib>(字符转换)和<cuchar>分别。

  2. 这些标头的内容应与标准 C 库标头<ctype.h><wctype.h><string.h><wchar.h><stdlib.h>和 C Unicode TR 标头分别<uchar.h>以下修改:

strlen在 C++ 的<cstring>中定义。以下修改未提及strlen.由此,我可以得出结论,C++中的签名必须与 C 中的签名完全相同,并且由于 C 没有constexpr,它在技术上是不合规的。也就是说,这是那些不太可能造成任何伤害的不合规的事情之一,除了在一个平台上依赖它然后在另一个平台上找不到它之外。

首先,您可能会混淆两者的功能: strlen() 给出整个字符串的长度,sizeof() 给出内存中数据类型占用的内存空间大小。

函数sizeof()是一个编译时表达式,因为变量的内存是在编译时分配的(鉴于它不是动态写入的)。因此,为您提供数据类型占用的内存大小。它不关心变量的值,只关心内存空间。

strlen()是一个函数,它接受指向字符的指针,并不断从该字符 o 递增内存,查找位于字符串末尾的 NULL 字符。它在找到 NULL 字符之前计算字符数。基本上,给你长度。