我有一段带有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:语法错误:标识符'GeoLocation'。
似乎MSVC没有“看到”libastro/AstronomyStructs.h
文件中的定义。当我用#include "PathTypes.h"
替换#include "libastro/AstronomyStructs.h"
时,代码编译没有错误。
如何让MSVC 2003实际“看到”嵌套包含文件中的定义?
文件PathTypes.h
与包含它的代码位于同一目录中。
答案 0 :(得分: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;
...
};