我正在开发一个加密应用程序,它实现了我制定的算法。我有大约一年的 C 经验和 6 个月的 C++ 经验,但我有 6 年的 Visual Basic 和 Gambas 经验(我希望我是一个快速学习者)。我想让我的新应用程序尽可能高效;这就是我选择 C 而不是 C++ 的原因(我想使用一种低级语言)。
在我的程序中,我使用定义的字符串常量来处理错误消息。我知道预处理器在每次出现时都会用实际字符串替换宏名称。如果我没记错的话,这意味着它预先分配了字符串常量并为每次出现返回不同的指针。我必须释放所有这些字符串指针吗?实际上这看起来有点奇怪...它们的指针是像自动变量(这意味着它们在退出作用域时被释放)还是它们永远保持为常量?
我使用一个名为 messages.h 的专用头文件,其中包含程序可能使用的每个可能的错误消息的定义,以便我可以更轻松地更改语言等;因此我不能直接将它们写成字符串常量。我想将它们声明为常量变量,但是我要么必须使用具有实际值的 C 文件并将 header 版本声明为 extern,要么在包含 messages.h header 的每个文件中重新声明所有常量(相信我,我有超过 20 个文件组成该项目,大约 50-100 条消息,加上提示消息——大约 30 条长消息——所以它会消耗大量内存。
你有什么建议?是否应该——更重要的是我能否——释放指向常量的指针?
最佳答案
欢迎使用 C,我希望你永远不会回到 VB ;), ...宏,不,你不必释放那些“字符串”,它不会为每次出现返回不同的指针,采取一看:
#include <stdio.h>
#define ERROR_MSG "Bla bla bla"
int main(void)
{
printf("%p\n", (void *)ERROR_MSG);
printf("%p\n", (void *)ERROR_MSG);
return 0;
}
输出:
0x40061c
0x40061c
如您所见,打印了相同的地址。
关于c - 自由定义的字符串常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16592321/