自由定义的字符串常量

时间:2013-05-16 16:02:30

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

我正在开发一个加密应用程序,它实现了我制作的算法。我有大约一年的C语言经验和6个月的C ++经验,但我有6年的Visual Basic和Gambas经验(我希望我能快速学习)。我想让我的新应用程序尽可能高效;这就是我选择C而不是C ++的原因(我想使用一种低级语言)。

在我的程序中,我使用定义的String常量来处理错误消息。我知道预处理器会在每次出现时用实际字符串替换宏名称。如果我没有弄错,这意味着它预先分配字符串常量并为每次出现返回一个不同的指针。我是否必须释放所有这些字符串指针?实际上它似乎有点奇怪...它们的指针是否像自动变量(这意味着它们在退出范围时被释放)或者它们是否永远保留为常量?

我使用一个名为messages.h的专用头文件,其中包含程序可能使用的每个可能错误消息的定义,以便我可以更容易地更改语言等。因此我不能直接将它们写成字符串常量。我想将它们声明为常量变量,但是我要么必须使用带有实际值的C文件并将头版本声明为extern,要么在每个包含messages.h头文件的文件中重新声明所有常量(相信我,我有超过20个文件组成该项目,大约50-100条消息,加上提示信息 - 大约30条长信息 - 所以它会消耗相当多的内存。)

你有什么建议?应该 - 更重要的是我可以 - 释放指向常量的指针吗?

1 个答案:

答案 0 :(得分:1)

欢迎来到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

如您所见,打印的地址相同。

相关问题