c++ - 如何在 C++ 中创建单个全局 char*

标签 c++ c arrays global-variables c++98

我正在维护一个自定义日志记录系统,该系统使用宏来执行诸如向每条消息附加时间戳和源文件名之类的操作。所以类似:

AI_LOG("Hello %s", "World!");

可能会导致:

(16.38) HelloWorld.cpp LOG: Hello World!

目前,它在堆栈上创建一个 char* 缓冲区,将输出的初始部分放入缓冲区的开头,然后使用 snprintf 将输出复制到缓冲区的其余部分。这一切都有效......除了它在堆栈上创建缓冲区,如果我有一个足够深的堆栈和足够的日志语句,并且我没有将缓冲区保持得很小(例如256个字符),我可能会遇到堆栈溢出。我现在需要输出更长的字符串,因此将所有这些缓冲区放在堆栈上不再对我有用。

考虑到这一背景...我想转向单个全局字符数组,我会将其做得很大(可能从 4K 字符开始)。但是,我的理解是,如果我只是说:

#define AI_OUTPUT_BUFFER_SIZE 4092
char AI_OUTPUT_BUFFER[AI_OUTPUT_BUFFER_SIZE];

在我的输出系统的 .h 文件中,那么我将面临由包含该 .h 文件的每个文件创建单独缓冲区的风险。这是一个真正的问题吗?如果是这样,是否有一种好的(与编译器无关、符合 C++98、不使用 Boost)方法来获取我想要的单个缓冲区?

我倾向于在标题中这样做:

#define AI_OUTPUT_BUFFER_SIZE 4096
class AIOutputBuffer
{
public:
    static char buffer[AI_OUTPUT_BUFFER_SIZE];
};

然后在 .cpp 中我可以:

char GAIA::AIOutputBuffer::buffer[AI_OUTPUT_BUFFER_SIZE];

但这让我的链接器头疼......也许我还没有做得正确?

在人们建议之前...是的,我可能可以重写它以使用字符串或流...但我真的不想重写整个系统,我也没有时间和资源来做到这一点。这个系统运行良好,给了我很大的灵 active - 我只需要处理内存使用问题。

最佳答案

从评论中(感谢德米特里!)我使用了 extern,它的效果就像一个魅力。所以在标题中:

#define AI_OUTPUT_BUFFER_SIZE 256
extern char AI_OUTPUT_BUFFER[AI_OUTPUT_BUFFER_SIZE];

然后在.cpp中:

char AI_OUTPUT_BUFFER[AI_OUTPUT_BUFFER_SIZE];

关于c++ - 如何在 C++ 中创建单个全局 char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37258920/

相关文章:

函数中的 C++ 数组

c++ - 在 Xcode 中新建一个 "Shell Tool"目标,用于 Google Test

c++ - 配置文件解析错误

c - 如何在 C 中使用 InternetGetLastResponseInfo

C Linux 设备编程 - 直接从/Dev 读取

c++ - 如何使用VS2008 Pro自带的单元测试工具测试C++项目?

python - gtk+ 复选按钮设置

Javascript,有没有办法将数组编写为没有逗号或空格的单个文本字符串?

java - 如何阻止程序退出二维数组的边界

arrays - VB : Type Mismatch Error, 数组维度 1x1