预处理器初始化哈希变量

问题描述 投票:0回答:1

我发现了有关创建uint32_t大小的字符串的哈希的描述:http://lolengine.net/blog/2011/12/20/cpp-constant-string-hash

我想使用此宏来初始化全局变量。我不想将字符串添加到已编译的二进制文件中,仅添加哈希值。

但是使用此宏时出现错误:error:Initializer element is not constant

是否有针对C和GCC编译器的解决方法?

还有其他通过预处理器放置字符串的哈希的想法吗?

hash macros c-preprocessor
1个回答
0
投票

在C中,静态初始化程序必须是一个常量表达式,而C对于常量表达式是什么非常挑剔:

[应具有算术类型,并且仅应具有整数常量,浮点常量,枚举常量,字符常量,结果为整数常量的sizeof表达式和_Alignof表达式的操作数。 (§6.6/ 8)

请注意,字符串文字不在有效操作数列表中,因此"A string"[2]不符合条件。

C ++不需要静态初始值设定项作为常量表达式,并且对于被接受为常量表达式的内容也要慷慨得多。 (例如,static const int变量可以在C ++中使用,但不能在C中使用。)

因此,C预处理程序将无法帮助您构造一个静态声明,该声明被初始化为从字符串计算得出的哈希值。如果您确实想这样做,最好的选择可能是使用实用程序对源文件进行预处理,该实用程序可以识别对HASH的调用,并将其替换为计算得到的哈希作为整数常量。

© www.soinside.com 2019 - 2024. All rights reserved.