如何在编译期获取char指针指向字符串的长度?
编译期获取字符串长度的解决方案
好问题!确实,当你用char const*指向字符串字面量时,sizeof(string)拿到的只是指针的大小(64位系统上就是8,减1后得到7,这就是你遇到的情况),没法直接拿到字符串本身的长度。不过我们有几种靠谱的编译期方案,能替代运行时的strlen,一起来看:
1. C++11及以后:用constexpr递归函数
你可以写一个编译期就能执行的strlen版本,利用C++11引入的constexpr特性:
constexpr size_t constexpr_strlen(const char* s) { // 递归终止条件:遇到空字符就返回0,否则继续计算 return *s ? 1 + constexpr_strlen(s + 1) : 0; } // 使用示例 const char* str = "Hello World"; constexpr size_t len = constexpr_strlen(str); // 编译期直接算出11
这个函数在编译阶段就会递归遍历字符串字面量,直接得到长度结果,完全不会有运行时开销。
2. C++11之前:模板元编程方案
如果你的项目还在使用C++03这类老标准,可以用模板特化来实现编译期长度计算:
// 模板函数,匹配数组类型 template <size_t N> size_t string_length(const char (&)[N]) { return N - 1; // 数组大小包含末尾的空字符,所以减1 } // 用宏包装,方便直接传入字符串字面量 #define GET_STR_LEN(s) string_length(s) // 使用示例 const size_t len = GET_STR_LEN("Hello World"); // 编译期得到11
不过要注意:这个方法只能直接处理字符串字面量或者数组类型的变量,如果是已经声明为char*的变量,编译器没法推导数组大小,所以这个方案对纯char*变量无效。
3. C++17及以后:用std::string_view
C++17引入的std::string_view是处理字符串字面量的绝佳工具,它的size()方法在编译期就能返回正确长度:
#include <string_view> // 直接定义constexpr的string_view constexpr std::string_view sv = "Hello World"; constexpr size_t len = sv.size(); // 编译期得到11 // 或者针对已有的const char*变量(指向编译期字符串的情况) const char* str = "Hello World"; constexpr std::string_view sv_from_ptr(str); constexpr size_t len2 = sv_from_ptr.size();
这个方案最简洁,而且std::string_view本身就是轻量级的,不会有额外开销,非常推荐在C++17及以后的项目中使用。
重要注意事项
所有这些编译期方案的前提是:字符串的内容必须在编译期是已知的。如果你的char*指向的是运行时才确定的内容(比如用户输入、动态分配的字符串),那编译期根本不可能获取它的长度,只能使用运行时的strlen。
内容的提问来源于stack exchange,提问作者Elec
相关产品推荐
相关产品推荐

