c - 自由定义的字符串常量

标签 c string c-preprocessor free dynamic-memory-allocation

我正在开发一个加密应用程序,它实现了我制定的算法。我有大约一年的 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/

相关文章:

在 C 中使用宏连接代码

c - C中VS2013文件打开错误

r - 检查非唯一字符的字符串模式

c - 数组 [1 -'a' ] 在 C 编程中如何工作?

javascript - 控制台将内部 Html 记录为 Javascript 中的单行字符串

Python:通过替换其符号来创建字符串的所有派生词

c - 在运行时修改结构体字段

c++ - #define 在 C/C++ 中的用法

c - 使用管道将整数从 n 个子级发送到父级 (c/unix)

c - 函数的参数是如何执行的?