[英]Can template metaprogramming be used to encrypt compile-time constant data?
可以使用模板元編程來加密編譯時常量數據嗎?
讓我用一個例子解釋一下我的意思。 假設我記錄了有關失敗代碼行的信息,如下所示:
if (index > MaxIndex) { Log(__FILE__); abort(); }
可能以某種方式(使用模板元編程或其他魔術)編寫Log()
以便替換__FILE__
的編譯時常量字符串被加密,以便二進制文件中使用的實際數據是編譯時加密字符串嗎? 如果沒有,為什么?
你的假設不正確。 C99僅定義__func__
,但GCC提供__FUNCTION__
和__PRETTY_FUNCTION__
作為擴展,其行為相同。 它們都不是宏 ,而是標識符 。 例如C11,6.4.2.2:
標識符
__func__
應由翻譯器隱式聲明,就像緊跟在每個函數定義的__func__
括號之后的聲明一樣static const char __func__[] = "function-name";
出現了,其中function-name是詞法封閉函數的名稱
不幸的是,在C ++ 11中, static const char []
不是常量表達式,因此上述標識符都不能用作模板元程序參數。
(相比之下, __FILE__
和__LINE__
是用文字替換的宏,所以你可以很好地靜態處理它們。)
(簡單的展示示例:)
template <unsigned int I, unsigned int N>
constexpr char get(char const (&arr)[N]) { return arr[I]; }
template <char C> struct Foo { };
int main()
{
Foo<get<2>(__FILE__)> ok;
Foo<get<2>(__FUNCTION__)> err1; // "error: the value of ‘__func__’ is not usable in a constant expression"
Foo<get<2>(__PRETTY_FUNCTION__)> err2;
Foo<get<2>(__func__)> err3;
}
使用C ++ 11,應該可以使用簡單的constexpr
函數,這些函數可以在編譯時進行評估。 這應該比一些模板元編程更具可讀性(但是,它可能會默默地回退到函數的運行時評估 - 在您的情況下可能或可能不需要)。 還要考慮@KerrerSB寫的關於__func__
不是常量表達式的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.