如何在Visual Studio 2017中创建C++队列全局变量?
如何在Visual Studio 2017中正确设置全局队列变量?
嘿,我来帮你搞定这个全局队列的问题!从你贴的代码来看,你已经用到了extern声明,但大概率还缺了关键的变量定义步骤——这是新手搞全局变量时最容易踩的坑,我给你一步步捋清楚:
1. 先在头文件里做全局变量的声明
你可以把这个声明放在TestClass.h里,或者专门建一个globals.h来管理全局变量(更规范),记得加上头文件保护防止重复包含:
#pragma once #include <queue> // 要确保Message基类的声明在这里,或者已经包含了它的头文件 class Message; // 用extern告诉编译器:这个变量在别的地方定义好了,我只是用它 extern std::queue<Message*> g_incoming;
2. 在单独的cpp文件里定义全局变量
这一步非常关键!绝对不能在头文件里定义全局变量,不然每个包含这个头文件的cpp都会生成一个变量副本,最后链接的时候会报“多重定义”错误。
比如你可以新建一个globals.cpp,或者把定义放在TestClass.cpp里:
#include "TestClass.h" #include <queue> #include "Message.h" // 必须包含Message类的完整定义,不然队列没法正常工作 // 这里才是真正创建全局变量的地方,只需要写一次 std::queue<Message*> g_incoming;
3. 调整你的main.cpp代码
你的main代码已经有了extern声明,但其实如果已经包含了有extern声明的头文件,这里可以不用重复写。另外别忘了包含子类的头文件,还有最后要清理内存(不然会有内存泄漏):
#include "TestClass.h" #include "PFRHelloMessage.h" // 确保子类的定义被包含 #include "DropLinkMessage.h" using namespace std; int main() { PFRHelloMessage* msg1 = new PFRHelloMessage(0, 1, 2, 30, 40, 1500, 45, 17); g_incoming.push(msg1); DropLinkMessage* msg2 = new DropLinkMessage(1, 3, 4); g_incoming.push(msg2); // 记得清理队列里的指针,避免内存泄漏 while (!g_incoming.empty()) { Message* tempMsg = g_incoming.front(); g_incoming.pop(); delete tempMsg; } return 0; }
几个要注意的坑
- 头文件保护:一定要加
#pragma once或者#ifndef ... #define ... #endif,不然重复包含会引发各种奇怪的错误。 - 不完整类型:如果编译器报“Message是不完整类型”,说明你没包含Message类的完整定义,只放了声明——队列需要知道类型的大小,所以必须包含子类和基类的头文件。
- 内存泄漏:全局队列里存的是指针,程序结束前一定要手动释放,全局变量的内存会在程序结束后被系统回收,但指针指向的堆内存不会,所以必须逐个delete。
内容的提问来源于stack exchange,提问作者elbillaf
相关产品推荐
相关产品推荐

