2 ) { // Do something... } 但我试图避免在代码中使用“魔法”常量。 通常我使-6ren">
gpt4 book ai didi

c++ - 编译时 "strlen()"有效吗?

转载 作者:IT老高 更新时间:2023-10-28 23:17:41 25 4
gpt4 key购买 nike

有时需要将字符串的长度与常数进行比较。
例如:

if ( line.length() > 2 )
{
// Do something...
}

但我试图避免在代码中使用“魔法”常量。
通常我使用这样的代码:

if ( line.length() > strlen("[]") )
{
// Do something...
}

可读性更强,但由于函数调用,效率不高。
我写的模板函数如下:

template<size_t N>
size_t _lenof(const char (&)[N])
{
return N - 1;
}

template<size_t N>
size_t _lenof(const wchar_t (&)[N])
{
return N - 1;
}

// Using:
if ( line.length() > _lenof("[]") )
{
// Do something...
}

在发布版本 (VisualStudio 2008) 中,它会生成非常好的代码:

cmp    dword ptr [esp+27Ch],2 
jbe 011D7FA5

好在编译器不会在二进制输出中包含“[]”字符串。

是编译器特定的优化还是常见的行为?

最佳答案

为什么不

sizeof "[]" - 1;

(对于尾随的 null 减一。你可以做 sizeof "[]"- sizeof '\0',但 sizeof '\0'在 C 中通常是 sizeof( int ),而“- 1”是完全可读。)

关于c++ - 编译时 "strlen()"有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1391708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com