【发布时间】:2018-06-05 16:39:32
【问题描述】:
出于许多目的,打包成无符号 32 位整数的短字符串/字符数组非常有用,因为它们可以通过简单的整数比较一次性进行比较,并可用于switch 语句,同时仍保持有点人类可读性。
将这些短字符串转换为 32 位整数的最常用方法是移位/或:
#include <stdint.h>
uint32_t quadchar( const char* _str )
{
uint32_t result = 0;
for( size_t i=0; i<4; i++ )
{
if( _str[i] == 0 )
return result;
result = (result << 8) | _str[i];
}
return result;
}
过长的字符串会被截断。
到目前为止一切顺利,但这必须在运行时完成,这会花费一些时间。 是否也可以在编译时执行此操作?
【问题讨论】:
-
使用 C++14 及更高版本,您只需将
constexpr添加到您的函数中。已经有一个答案显示如何为 C++11 执行此操作(即递归)。对于 C++03,几乎不可能获得良好的语法,但 C++03 的一个解决方案是通过一些脚本对源代码进行预处理。 -
联合方法将是未定义的行为,结果取决于 CPU 的字节序。
-
@Barmar:真的,谢谢。我删除了这段话。
标签: c++ string c++11 integer constexpr