1

いくつかのユニオンとそれらのユニオンのインライン関数を定義しようとすると、VC++2010 Express で興味深いエラーが発生します。多くのプログラムで使用する静的ライブラリを構築しようとしています。

typedef union
{
    double data[3];
    struct { double x, y, z; };
} VECTOR3;

inline VECTOR3 _V3(double x, double y, double z)
{
    VECTOR3 vec = { x, y, z };
    return vec;
}

typedef union
{
    double data[9];
    struct { double x0, y0, z0, x1, y1, z1, x2, y2, z2; };
} MATRIX3;

inline MATRIX3 _M3(double x0, double y0, double z0, double x1, double y1, double z1, double x2, double y2, double z2)
{
    MATRIX3 mat3 = { x0, y0, z0, x1, y1, z1, x2, y2, z2 };
    return mat3;
}

このコードはエラー「C2371: 再定義; 異なる基本型」を生成していますが、これらの共用体が定義されているのはここだけです。

インライン関数は、「C2084: 関数 'FunctionName(ArgumentType)' には既に本体があります」というエラーが発生しますが、他の本体は定義されていません。このファイル、または参照されているファイルのいずれかです。

さらに、ここに示されているようなコードは、別のアプリケーションの SDK にあります。また、その SDK を使用したビルドでは、これらのエラーは発生しません。

私の検索はどれも役に立ちませんでした。

4

1 に答える 1

1

このコードはヘッダー ファイル (.h) にあると思います。

ガードを含める必要があります:

#ifndef YOUFILE_h__
# define YOUFILE_h__

// Your code

#endif // !YOUFILE_h__

同じ翻訳単位に同じファイルが複数含まれることを回避します。

このヘッダー ファイルが同じソース ファイルに何度も (場合によっては他のヘッダーを介して) インクルードされる場合、インクルード ガードがない限り、共用体が複数回定義されます。

于 2013-09-17T21:51:50.380 に答える