如何声明 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_view
和string_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 字符串?的主要内容,如果未能解决你的问题,请参考以下文章