gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:57:34 25 4
gpt4 key购买 nike

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

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

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

是否有可能(使用模板元编程或其他魔法)编写 Log() 以便替换 __FILE__ 的编译时常量字符串被加密,以便二进制文件中使用的实际数据是编译时加密的字符串?如果不是,为什么?

最佳答案

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

The identifier __func__ shall be implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration

static const char __func__[] = "function-name";

appeared, where function-name is the name of the lexically-enclosing function

不幸的是,在 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++ - 模板元编程可以用来加密编译时常量数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18563280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com