在编译时评估strlen?

时间:2017-09-07 16:38:56

标签: c++ language-lawyer constexpr

如果我的代码有constexpr字符串

constexpr char my_str[] = "hello";

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

strlen(my_str)怎么样?是否可以将它评估为编译时常量?

以下是“https://ideone.com/2U65bN

”的示例

以下是no http://coliru.stacked-crooked.com/a/8cb094776dfc5969

的示例

标准对此有何评论?当然不是“也许”?

3 个答案:

答案 0 :(得分:5)

在C ++ 17中,您可以使用constexpr(而不是strlenstd::char_traits::length

答案 1 :(得分:3)

21.8,1和2,标准中说:

  
      
  1. 表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>

  2.   
  3. 这些标头的内容应与标准C库标题<cuchar><ctype.h>相同,   <wctype.h><string.h><wchar.h>以及C Unicode TR标题<stdlib.h>分别与   以下修改:

  4.   

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

答案 2 :(得分:2)

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

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

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