我发现了有关创建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
的调用,并将其替换为计算得到的哈希作为整数常量。