几天前,我发现您可以使用以下代码找到编译时strlen:
template<size_t N>
constexpr size_t strlen_(const char (&data)[N]) noexcept{
return N - 1;
}如果它被编译了,那么一切都是好的。可以添加重载,如下所示:
size_t strlen_(const char *s) noexcept{
return strlen(s);
}然后,它将始终编译。
我的问题是- C++ <cstring>是否使用了这样的东西,如果没有-为什么?
发布于 2016-04-04 03:29:06
不,它不会。因为它给出了错误的答案。
char x[10] = "abc";
int correct_length = std::strlen(x); // 3
int incorrect_length = strlen_(x); // 9此外,使用2重载时,模板将永远不会被调用。接受const char*的非模板类总是首选的。
这并不意味着不能在编译时使用一些编译器魔术来计算strlen。但是,使用适当的语言,不能这样做。
发布于 2016-04-04 04:02:25
您的strlen_返回数组data的大小,而不是以null结尾的字符串的大小。正确的实现应该是:
constexpr size_t ct_strlen( const char* s ) noexcept
{
return *s ? 1 + ct_strlen(s + 1) : 0;
}发布于 2016-04-04 03:27:36
你的代码是错误的。
令人惊讶的是,在strlen()上进行编译时优化的正确方法是调用strlen()。像clang这样的现代编译器在知道编译时的长度时,会优化掉不必要的strlen()。
此外,在大多数情况下,当程序员将sizeof与保存文字字符串的变量一起正确使用时,它会派上用场。像这样:
const char foo[] = "Hello World";
size_t len = sizeof(foo)-1; // 11请注意,这有一些假设,如果你这样做,你会给自己带来麻烦,但不会让你的生活变得简单:
const char foo[] = "Hello World\01234";
size_t len = sizeof(foo)-1; // 16编辑:让明显的更多看起来像一个答案。
https://stackoverflow.com/questions/36389936
复制相似问题