有没有什么方法可以在编译时为每个变量创建唯一的哈希值。
C++ 允许块作用域,这可能会在一个函数内产生相同的命名变量,所以我不能这样做:
#define MACRO(...) ConstevalHash(__PRETTY_FUNCTION__ #__VA_ARGS__)
int variable = 0;
printf("id %d \n", MACRO(variable));
编译后的文件应如下所示:
printf("id %d \n", 345908340) // unique hash
我想尝试使用 consteval 技巧来获取每个变量的静态内存地址,但恐怕当前的 cpp 是不可能的。
编辑:
这正在解决编译时间计数器的问题。
当前的解决方案只是:
#define MACRO(...) __VA_ARGS__.CachedID // static constexpr int CachedID ;
Var<ID, int> Variable = 0; // Id creates unique id using counter
MACRO(variable);
这不允许使用 auto,这对于任何 api 来说都不是很好的解决方案。
关于块作用域
void Function()
{
{ int var = 0; MACRO(var); }
{ int var = 0; MACRO(var); }
}
while(true)
{
Function();
}
这两个哈希值应该不同,但它们应该在循环内的每个刻度中保持完全相同,这就是需要编译时编码的原因。
我想出了这个:
template <class T> struct var {
using hash_type = unsigned;
using value_type = T;
value_type value;
const hash_type cached_id;
constexpr var(const value_type the_value) noexcept
: value(the_value)
, cached_id([]{ static hash_type k; return k++; }())
{}
constexpr operator auto() noexcept { return value; }
};
template <class T> var(T const&) -> var<T>;
在编译器资源管理器上运行
没有宏。
这是您要找的吗?