0

我有一段带有 COM 类声明的代码,如下所示:

#include "PathTypes.h"

MIDL_INTERFACE("552C7555-0555-4444-BA86-56CF39AAFFFF")
IPathCalc : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetLocation(
        /* [retval][out] */ GeoLocation* pLoc) = 0;
    virtual HRESULT STDMETHODCALLTYPE SetLocation(
        /* [in] */ GeoLocation* pLoc) = 0;
    ...
    };

以下是PathTypes.h文件内容:

#if !defined(PATHCALC_TYPES_INCLUDED)
#define PATHCALC_TYPES_INCLUDED

#include "libastro/AstronomyStructs.h"

#endif

并且libastro/AstronomyStructs.h来自外部跨平台库:

#ifndef _ASTRONOMY_STRUCTS_INCLUDED
#define _ASTRONOMY_STRUCTS_INCLUDED

typedef struct {
    double lattitude;
    double longitude;
} GeoLocation;

...

    #endif  /* _ASTRONOMY_STRUCTS_INCLUDED */

当我尝试用 g++ 构建这段代码时,一切都很顺利。这不是 MSVC 2003 返回错误 C2061: syntax error : identifier 'GeoLocation' 的情况。

似乎 MSVC 没有“看到”libastro/AstronomyStructs.h文件中的定义。当我#include "PathTypes.h"#include "libastro/AstronomyStructs.h"代码替换时编译没有错误。

如何让 MSVC 2003 真正“看到”嵌套包含文件中的定义?

更新1:

该文件PathTypes.h与包含它的代码位于同一目录中。

4

1 回答 1

0

如何让 MSVC 2003 真正“看到”嵌套包含文件中的定义?

应该这样做 - 我的猜测是"PathTypes.h" 从不同的地方读取的(你的系统上有多个版本吗?)。或者可能是循环包含的情况,但您无法从发布的代码中分辨出来。照原样,它应该可以工作。

注意:宏_ASTRONOMY_STRUCTS_INCLUDED是非法的,去掉前导下划线。

另外,请注意,在这种情况下,您不需要完整的定义,前向声明就足够了:

class GeoLocation; //forward-declaration

IPathCalc : public IUnknown
{
virtual HRESULT STDMETHODCALLTYPE GetLocation(
    /* [retval][out] */ GeoLocation* pLoc) = 0;
virtual HRESULT STDMETHODCALLTYPE SetLocation(
    /* [in] */ GeoLocation* pLoc) = 0;
...
};
于 2012-10-18T16:59:57.003 回答