在编译时评估 strlen?
Evaluating strlen at compilation time?
如果我的代码有这个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说:
表 74、75、76、77、78 和 79 描述了标头
<cctype>
、<cwctype>
、<cstring>
、<cwchar>
、<cstdlib>
(字符转换)和<cuchar>
分别。这些标头的内容应与标准 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 字符之前计算字符数。基本上,给你长度。
- std::condition_variable::wait()如何评估给定的谓词
- c++11评估顺序(未定义的行为)
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 如何使用"equal to"以外的评估编写开关语句
- 嵌套 if 中没有返回评估
- 懒惰的参数评估try_emplace?
- 在实践中,在运行时为零的乘法中是否有任何"lazy"评估
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- C++17:使用 std::optional 来评估枚举是否包含值
- CNTK:->转发或 ->评估某些电脑上的崩溃,而不是其他电脑上的崩溃
- ConstexPR :GCC比Clang更努力地评估ConstexPR
- std::strlen 在内部是如何工作的?
- 为什么strlen(s)与s的大小不同,为什么cout-char显示的是字符而不是数字
- C++:Constexpr斐波那契数列评估
- C++能保证论点评估的原子性吗?
- 在编译时评估函数开销的通用方法
- 如何使用 std::forward 精确地评估参数包的扩展?
- C++编译 strlen 和 strcpy 的问题
- MSVC 在不知道类型的情况下评估上下文(和错误)
- 在编译时评估 strlen?