如何声明 constexpr C 字符串?

Posted

技术标签:

【中文标题】如何声明 constexpr C 字符串?【英文标题】:How to declare constexpr C string? 【发布时间】: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";就够了。 【参考方案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

以上是关于如何声明 constexpr C 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

字符串文字与整数中的C ++ constexpr vs宏

constexpr 和不推荐使用的转换警告

初始化constexpr std ::数组对

如何从预处理器#if 指令调用 constexpr 函数?

constexpr:确定性的常量优化

为啥**不**将函数声明为`constexpr`?