gpt4 book ai didi

c++ - 如何指示 VC++ 编译器不内联常量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:19 25 4
gpt4 key购买 nike

我的 C++ 程序中有以下全局常量:

const int K = 123456 ;

当我编译程序时,生成的可执行文件在所有使用该值的地方(数十次)都包含文字值 123456

但是,如果我删除 const 限定符,值 123456 在整个可执行文件中只出现一次(在 .data 部分) .
这是我正在寻找的结果。我希望值 123456 只出现一次,以便只需使用十六进制编辑器编辑 .exe 文件即可更改它。

但是,我不想删除 const 限定符,因为我希望编译器防止我不小心修改源代码中的常量。

是否可以指示编译器以某种方式不内联所述常量的值?


我需要这样做的原因是,可执行文件很容易被负责“破解”示例程序以改变其行为的学生修改。对于没有经验的人来说,练习必须足够简单。

最佳答案

如果您不想内联K,那么将其放入头文件中:

extern const int K;

这意味着“K 在别处定义”。然后将其放入 cpp 文件中:

const int K = 123456;

在所有使用K的地方,编译器只知道K是一个const int声明的extern盟友。编译器不知道 K 的值,因此无法内联。链接器将在 cpp 文件中找到 K 的定义,将其放入可执行文件的 .data 部分。

或者,您可以这样定义 K:

const volatile int K = 123456;

这意味着“K 可能会神奇地改变,所以你最好不要假定它的值”。它与之前的方法具有类似的效果,因为编译器不会内联 K,因为它不能假设 K 将始终为 123456 .如果启用 LTO,之前的方法将失败,但在这种情况下使用 volatile 应该可行。

我必须说,这是一件非常奇怪的事情。如果你想让你的程序可配置,你应该把K的值放到一个文本文件中,然后在启动时读取这个文件。

关于c++ - 如何指示 VC++ 编译器不内联常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55771389/

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