我正在尝试创建全局结构,这将从源代码的任何部分看出.我需要它用于我的大型Qt项目,需要一些全局变量.这是:3个文件(global.h,dialog.h和main.cpp).对于编译,我使用Visual Studio(Visual C++).
global.h
#ifndef GLOBAL_H_
#define GLOBAL_H_
typedef struct TNumber {
int g_nNumber;
} TNum;
TNum Num;
#endif
Run Code Online (Sandbox Code Playgroud)
dialog.h
#ifndef DIALOG_H_
#define DIALOG_H_
#include <iostream>
#include "global.h"
using namespace std;
class ClassB {
public:
ClassB() {};
void showNumber() {
Num.g_nNumber = 82;
cout << "[ClassB][Change Number]: " << Num.g_nNumber << endl;
}
};
#endif
Run Code Online (Sandbox Code Playgroud)
和main.cpp
#include <iostream>
#include "global.h"
#include "dialog.h"
using namespace std;
class ClassA {
public:
ClassA() {
cout << "Hello from class A!\n";
};
void showNumber() {
cout << "[ClassA]: " << Num.g_nNumber << endl;
}
};
int main(int argc, char **argv) {
ClassA ca;
ClassB cb;
ca.showNumber();
cb.showNumber();
ca.showNumber();
cout << "Exit.\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我试图构建这个小应用程序时,编译工作正常,但链接器给我一个错误:
1>dialog.obj : error LNK2005: "struct TNumber Num" (?Num@@3UTNumber@@A) already defined in main.obj
有没有解决方案?
谢谢.
是.首先,不要num在头文件中定义.extern在标题中声明它,然后创建一个文件Global.cpp来存储全局,或者将其放入main.cppThomas Jones-Low的回答中.
其次,不要使用全局变量.
第三,typedef在C++中没有必要为此目的.您可以像这样声明您的结构:
struct TNum {
int g_nNumber;
};
Run Code Online (Sandbox Code Playgroud)