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++ でビルドしようとすると、すべてうまくいきます。これは、エラー C2061: syntax error : identifier 'GeoLocation'を返す MSVC 2003 には当てはまりません。

MSVC はlibastro/AstronomyStructs.hファイルの定義を「認識」していないようです。コードに置き換える#include "PathTypes.h"#include "libastro/AstronomyStructs.h"、エラーなしでコンパイルされます。

MSVC 2003 でネストされたインクルード ファイルの定義を実際に「見る」にはどうすればよいですか?

更新 1:

ファイルPathTypes.hは、それを含むコードと同じディレクトリにあります。

4

1 に答える 1

0

ネストされたインクルードファイルからの定義を実際に「見る」ようにMSVC2003を作成するにはどうすればよいですか?

それでうまくいくはずです-私の推測で"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 に答える