【问题标题】:How to declare constexpr C string?如何声明 constexpr C 字符串?
【发布时间】:2018-02-16 10:13:09
【问题描述】:

我想我很了解如何将关键字 constexpr 用于简单的变量类型,但是当涉及到指向值的指针时我感到困惑。

我想声明一个 constexpr C 字符串文字,其行为类似于

#define my_str "hello"

这意味着编译器将 C 字符串文字插入到我输入此符号的每个位置,并且我将能够在编译时使用 sizeof 获取它的长度。

constexpr char * const my_str = "hello";

const char * constexpr my_str = "hello";

constexpr char my_str [] = "hello";

还是有所不同?

【问题讨论】:

  • 好吧,你真的想要一个数组还是一个指向常量字面量的指针?
  • 要在编译时使用 sizeof 获得 "长度,重要的不是值,而是类型。
  • @NathanOliver:我想要一个可以放入 sizeof(my_str) 的东西,它会给我该字符串的字节数,而不是指针的大小。
  • 在这种情况下“等”是什么?
  • 那么const char my_str[] = "hello";就够了。

标签: c++ constexpr c-strings string-literals


【解决方案1】:

C++17,你可以使用std::string_viewstring_view_literals

using namespace std::string_view_literals;
constexpr std::string_view my_str = "hello, world"sv;

那么,

my_str.size() 是编译时间常数。

【讨论】:

  • 请注意,一般情况下,string_view::data 不保证以 null 结尾的字符串。
【解决方案2】:

constexpr char * const my_str = "hello";

不,因为字符串文字不能转换为 指向char 的指针。 (它曾经在 C++11 之前,但即使在那时,这种转换也被弃用了)。

const char * constexpr my_str = "hello";

没有。 constexpr不能去那里。

这将是良好的格式:

constexpr const char * my_str = "hello";

但它不能满足这一点:

这样我就可以在编译时使用 sizeof 等获得它的长度。


constexpr char my_str [] = "hello";

这是格式正确的,您确实可以在编译时使用sizeof 获得长度。请注意,此大小是数组的大小,而不是字符串的长度,即大小包括空终止符。

【讨论】:

  • strlen(my_str) 也适用于编译时;不知道你是否可以指望这个
  • @anatolyg 不确定你在哪里读到std::strlen 工作在编译时间。哪个实现有这个,它不符合标准?
  • Here 是一个演示;我认为他们正在使用 gcc
  • @anatolyg 啊,这不是在编译时计算的strlen,而是 VLA,一种允许在数组边界中使用非常量表达式的非标准扩展。这是demo
  • 这里只是稍微有点主题;我问了separate question
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 2010-12-31
  • 2010-11-28
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多