可以使用模板元编程来加密编译时常量数据吗?

时间:2013-09-01 21:46:50

标签: c++ encryption template-meta-programming

可以使用模板元编程来加密编译时常量数据吗?

让我用一个例子解释一下我的意思。假设我记录了有关失败代码行的信息,如下所示:

if (index > MaxIndex) { Log(__FILE__); abort(); }

可能以某种方式(使用模板元编程或其他魔法)编写Log(),以便替换__FILE__的编译时常量字符串被加密,以便在...中使用的实际数据binary是编译时加密的字符串?如果没有,为什么?

2 个答案:

答案 0 :(得分:3)

您的假设不正确。 C99仅定义__func__,但GCC提供__FUNCTION____PRETTY_FUNCTION__作为扩展,其行为相同。它们都不是,而是标识符。例如。 C11,6.4.2.2:

  

标识符__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;
}

答案 1 :(得分:1)

使用C ++ 11,应该可以使用简单的constexpr函数,这些函数可以在编译时进行评估。这应该比一些模板元编程更具可读性(但是,它可能会默默地回退到函数的运行时评估 - 在您的情况下可能或可能不需要)。还要考虑@KerrerSB写的关于__func__不是常量表达式的内容。