我发现了关于创建uint32_t大小的字符串哈希的描述: http://lolengine.net/blog/2011/12/20/cpp-constant-string-hash
我想使用此宏来初始化全局变量。我不想在编译的二进制中添加字符串,只添加哈希。
但是当使用此宏时,我收到错误:error:Initializer element is not constant
对于C和GCC编译器,是否有解决方法?
还有其他想法可以通过预处理器放置字符串的哈希吗?
在 C语言中,静态初始值设定项必须是常量表达式,C 对常量表达式非常挑剔:
算术常量表达式应具有算术类型,并且只能具有整数常量、浮点常量、枚举常量、字符常量
sizeof
结果为整数常量的表达式的操作数以及_Alignof
表达式。(§6.6/8(
请注意,字符串文本不在有效操作数列表中,因此"A string"[2]
不符合条件。
C++ 不要求静态初始值设定项是常量表达式,并且对于接受为常量表达式的内容也更加慷慨。(例如,static const int
变量可以在C++中使用,但不能在 C 中使用。
因此,C 预处理器将无法帮助您构造初始化为从字符串计算的哈希的静态声明。如果您真的想这样做,最好的办法可能是对源文件进行自己的预处理,使用一个实用程序来标识对HASH
的调用,并将它们替换为计算的哈希作为整数常量。