如果我的代码有constexpr
字符串
constexpr char my_str[] = "hello";
my_str
的类型包含有关其大小的信息,即sizeof(my_str)
是常数6,可以在任何需要常量的地方使用。
strlen(my_str)
怎么样?是否可以将它评估为编译时常量?
以下是no http://coliru.stacked-crooked.com/a/8cb094776dfc5969
的示例标准对此有何评论?当然不是“也许”?
答案 0 :(得分:5)
在C ++ 17中,您可以使用constexpr
(而不是strlen
)std::char_traits::length
。
答案 1 :(得分:3)
21.8,1和2,标准中说:
表74,75,76,77,78和79描述了标题
GsonBuilder b = new GsonBuilder(); b.serializeNulls(); b.setExclusionStrategies(new SerializeExclusionStrat()); Gson gson = b.create();
,<cctype>
,<cwctype>
,<cstring>
,<cwchar>
(字符转换)和<cstdlib>
。- 醇>
这些标头的内容应与标准C库标题
<cuchar>
,<ctype.h>
相同,<wctype.h>
,<string.h>
和<wchar.h>
以及C Unicode TR标题<stdlib.h>
分别与 以下修改:
<uchar.h>
在c ++的strlen
中定义。以下修改未提及<cstring>
。由此我得出结论,C ++中的签名必须与C中的签名完全相同,并且由于C没有strlen
,因此它在技术上是不兼容的。也就是说,除了在一个平台上依赖它而不是在另一个平台上找到它之外,这是不合规的事情之一,不会造成任何伤害。
答案 2 :(得分:2)
首先,您可能会混淆两者的功能: strlen()给出整个字符串的长度,sizeof()给出内存中数据类型占用的内存空间大小。
函数sizeof()
是一个编译时表达式,因为变量的内存是在编译时分配的(假设它不是动态写入的)。因此,为您提供数据类型占用的内存大小。它并不关心变量的值,只关心内存空间。
然而,strlen()
是一个函数,它接受一个字符指针,并不断从该字符o递增内存,寻找一个NULL字符,它位于字符串的末尾。它会在找到NULL字符之前计算字符数。基本上,给你一个长度。