我的應用包含大量ID。我想最終讓代碼可以被其他人查看,但是不能讓運行時反向工程師輕鬆查找容易識別的ID。另外,在開發過程中,日誌文件中的常量ID有助於更輕鬆地進行調試。但在運行時,我想通過在Release編譯期間生成這些ID來隨機生成這些ID。使用<random>
庫建議的代碼可以在GetRandomId1()
下面看到。 constexpr
使它們在代碼中的使用可能像在switch語句中一樣。但是,我在使用constexpr
時遇到了麻煩,因爲<random>
與constexpr
不兼容。有沒有另外一種方法在編譯時產生隨機數字?或者在編譯時產生隨機數,在運行時用作常量,這與constexpr
的概念相反?使用在編譯時生成的隨機ID替換魔幻ID號
#include <iostream>
#include <random>
// this is the code I would like to use to generate a random number at compile time
/*constexpr */int GetRandomId1()
{
std::random_device rd; // non-deterministic seed
std::mt19937 gen(rd()); // with constexpr uncommented:
// error C3250: 'rd': declaration is not allowed in 'constexpr' function body
// error C3249: illegal statement or sub-expression for 'constexpr' function
// error C3250: 'gen': declaration is not allowed in 'constexpr' function body
std::uniform_int_distribution<> distri(1000, 9999); // with constexpr uncommented:
// error C3250: 'distri': declaration is not allowed in 'constexpr' function bod
// error C3249: illegal statement or sub-expression for 'constexpr' function
// error C2134: 'std::uniform_int<_Ty>::operator()': call does not result in a constant expression
return distri(gen);
}
// this code is what works so far
constexpr int GetRandomId2()
{
return 22; // how to make somewhat random?
}
constexpr int AAA = 10;
//constexpr int AAA = GetRandonId1(); // error: is not constexpr function
constexpr int BBB = GetRandomId2(); // ok
void Func1(long ab)
{
switch(ab)
{
case AAA:
std::cout << AAA << std::endl;
break;
case BBB:
std::cout << BBB << std::endl;
break;
}
}
int main()
{
Func1(22); // ok: prints 22
return 0;
}
我要尋找一個簡單的,就像我提出了一個並不像大量使用的模板維護的解決方案,如How can I generate dense unique type IDs at compile time?建議。在這篇文章中@jmihalicza也指向Random number generator for C++ template metaprograms研究論文。本文描述了使用模板元編程生成編譯時隨機數,這是一個複雜的嘗試,可以完成IMO constexpr
所設計的任務(我敢說,或者應該這樣做)。
由於應用程序體系結構的原因,我不必擔心ID衝突,因此這不是問題。應用程序代碼將確保不會有重複項返回。
你總是可以添加一個自定義的預構建步驟,生成隨機數文件,成爲'#include'd – sp2danny