编译时变量的唯一哈希值

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

有没有什么方法可以在编译时为每个变量创建唯一的哈希值。

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();
}

这两个哈希值应该不同,但它们应该在循环内的每个刻度中保持完全相同,这就是需要编译时编码的原因。

c++ c++20 constexpr compile-time consteval
1个回答
0
投票

我想出了这个:

 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>;

在编译器资源管理器上运行
没有宏。 这是您要找的吗?

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