我正在创建一个简单的GUI库,我已经完成了第一次测试。奇怪的是,似乎没有定义任何Windows宏。我收到错误,例如“'NULL'未在范围中声明”,并且“HANDLE”未在范围内声明。“我认为它可能是我组织代码的方式,因为条目文件easywin.hpp中的东西也没有被定义,但它看起来像它应该工作。这是(大多数)easywin.hpp:
#ifndef EASYWIN_BASE_HPP
#define EASYWIN_BASE_HPP
#include <string>
#include <map>
//Strings are used everywhere, so might as well use them globally
using std::string;
/**
* A namespace to encapsulate WinAPI and prevent name clashing.
**/
namespace WinAPI{
#include <windows.h>
#include <commctrl.h>
}
//header includes (ordered according to inheritance)
#include "Application.hpp"
#include "Object.hpp"
#include "Widget.hpp"
#include "Container.hpp"
#include "Window.hpp"
#include "Dialog.hpp"
//not implemented yet, so don't include
//#include "Light.hpp"
#include "Heavy.hpp"
// there are more container types
#include "Control.hpp"
#include "Textbox.hpp"
#include "Tooltip.hpp"
//source includes
//needed to simplify class dependencies
#include "Application.cpp"
#include "Object.cpp"
#include "Widget.cpp"
#include "Container.cpp"
#include "Window.cpp"
#include "Dialog.cpp"
//not implemented yet, so don't include
//#include "Light.cpp"
#include "Heavy.cpp"
// there are more container types
#include "Control.cpp"
#include "Textbox.cpp"
#include "Tooltip.cpp"
#endif
我只是不明白。如果我在这个文件中包含所有内容,那些文件应该得到这个文件中定义的内容。我做错了什么?
编辑:为了鼓励更好的答案,我将发布git存储库:
答案 0 :(得分:3)
您需要摆脱WinAPI名称空间。即使你设法通过使用WinAPI ::确定需要它的东西来编译所有内容,链接器也无法找到任何内容,但它仍然无法构建。
为避免名称冲突,您应将所有代码放在单独的命名空间中,并单独使用Windows.h。
答案 1 :(得分:0)
大多数情况下,当我遇到这样的事情时,这是因为保护宏的双重定义。当您复制并粘贴头文件并忘记更改保护宏时,通常会发生这种情况。尝试在其他文件中搜索EASYWIN_BASE_HPP
。在较新的编译器上,您还可以使用#pragma once
使其更简单。
此外,在头文件中使用using
通常不是一个好主意。头文件的用户可以使用来自不同库的多个头文件。其中一个可能与string
标识符冲突。
答案 2 :(得分:0)
这应该是对IronMensan答案的评论,因为它完全正确但我无法适应那里......
Windows的API具有在全局命名空间中使用“HANDLE”类型的参数的函数,换句话说“:: HANDLE”。 Windows库已经编译以执行此操作,编译后的代码存在于user32.lib / dll等库中。
windows.h的目的是定义库中已经的类型和功能,以便您可以调用它们。您所做的是定义一些无关的类型,例如WinAPI :: HANDLE,这很好,但绝不会改变库包含需要:: HANDLE作为参数的函数的事实。
我明白你要做什么,这是一个很好的目标。然而,它无法工作。