Windows.h宏未定义

时间:2011-09-02 04:18:24

标签: c++ winapi

我正在创建一个简单的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存储库:

https://github.com/PiMaster/Easywin

3 个答案:

答案 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作为参数的函数的事实。

我明白你要做什么,这是一个很好的目标。然而,它无法工作。