可以使用模板元编程来加密编译时常量数据吗?
让我用一个例子解释一下我的意思。假设我记录了有关失败代码行的信息,如下所示:
if (index > MaxIndex) { Log(__FILE__); abort(); }
可能以某种方式(使用模板元编程或其他魔法)编写Log()
,以便替换__FILE__
的编译时常量字符串被加密,以便在...中使用的实际数据binary是编译时加密的字符串?如果没有,为什么?
答案 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__
不是常量表达式的内容。