神秘的多个声明
Mysterious multiple declarations
本文关键字:声明 更新时间:2023-10-16
我有一个名为"controls.h"的文件,它声明了将在 Win32 应用程序中使用的按钮的句柄。
#ifndef CONTROLS_H
#define CONTROLS_H
#include "Window.h"
HWND hwnd_Font_btn;
HWND hwnd_Color_btn;
#pragma region UI_FUNCTION_DEC
bool DrawUI(HWND parenthwnd);
#pragma endregion
#endif
这些句柄和函数声明在名为"controls.cpp"的文件中使用
#include "controls.h"
bool DrawUI(HWND parenthwnd)
{
hwnd_Font_btn = CreateWindowEx(NULL, L"BUTTON", L"Select Font", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
10, 10, 100, 25, parenthwnd, NULL, (HINSTANCE)GetWindowLong(parenthwnd, GWL_HINSTANCE), NULL);
hwnd_Color_btn = CreateWindowEx(NULL, L"BUTTON", L"Select Color", WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
10, 45, 100, 25, parenthwnd, NULL, (HINSTANCE)GetWindowLong(parenthwnd, GWL_HINSTANCE), NULL);
return true;
}
然后将"Controls.h"包含在"main.cpp"中,然后调用DrawUI。但是,我无法编译代码,因为 Visual Studio 说句柄是在多个位置声明的。
Error 1 error LNK2005: "struct HWND__ * hwnd_Font_btn" (?hwnd_Font_btn@@3PAUHWND__@@A) already defined in controls.obj D:QueryQuerymain.obj Query
Error 2 error LNK2005: "struct HWND__ * hwnd_Color_btn" (?hwnd_Color_btn@@3PAUHWND__@@A) already defined in controls.obj D:QueryQuerymain.obj Query
我根本看不出问题所在。我承认,我在编程方面没有经验,但Visual Studio的搜索功能显示这些仅用于标题和控件.cpp文件。
你能帮我追踪问题吗?
要在头文件中声明全局变量,您需要在它前面加上 extern
。然后,您需要在单个源文件(不是头文件)中定义变量的值。
在controls.h
:
extern HWND hwnd_Font_btn;
在controls.cpp
:
HWND hwnd_Font_btn;
省略头文件中的extern
时,可以在包含头文件的每个源文件中定义变量,并且不允许定义多个同名变量。
你也可以这样想:
使用 extern
声明变量会告诉链接器,对象文件中的其他位置将有一个具有声明类型和名称的变量。
不使用extern
实际上定义了变量,包括允许链接器引用与变量关联的内存位置的初始值。
该行的每个实例:
#include "controls.h"
将整个"controls.h"粘贴"到代码中的该位置。
这使得该标题中的这些行...
HWND hwnd_Font_btn;
HWND hwnd_Color_btn;
。违反一个定义规则。
将它们更改为:
extern HWND hwnd_Font_btn;
extern HWND hwnd_Color_btn;
然后在一个 cpp 文件中定义它们一次。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在函数内部的声明中初始化数组,并在外部使用它
- Visual Studio中的函数声明和函数定义问题
- c++类声明时,相同的例程,不同的成员变量类型
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别