インクルードファイルでの再定義エラー

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
タリック

インクルードファイルでの再定義エラー

#1

投稿記事 by タリック » 12年前

ARTK_MMD(ARToolKit)をベースにして、kinectでスケルトンを読み込んでPMDを動かしたいんですが、
VecMatQuat.h(ar側)とNuiSensor.h(kinect側)にあるVector4の構造体の記述が重複しているようです。 エラーの内容は次の通りです。
1>C:\Program Files\Microsoft SDKs\Kinect\v1.6\inc\NuiSensor.h(126): error C2371: 'Vector4' : 再定義されています。異なる基本型です。
1> c:\artk_mmd_src_no_bullet\artk_mmd_src\src\mmd\VecMatQuat.h(19) : 'Vector4' の宣言を確認してください。
VecMatQuat.hでは
struct Vector4
{
float x, y, z, w;
};
NuiSensor.hでは
#ifndef _Vector4_
#define _Vector4_
typedef struct _Vector4
{
FLOAT x;
FLOAT y;
FLOAT z;
FLOAT w;
} Vector4;
#endif _Vector4_
となっています。

名前領域を設定してみたりしてみましたが、nuiskeleton.hの方で参照エラーがでてうまくいきません。
1,ヘッダーファイルは書き換えない
2,両方の構造体を区別して利用する
できればこの2つを方針として何か解決策はないでしょうか?よろしくお願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: インクルードファイルでの再定義エラー

#2

投稿記事 by h2so5 » 12年前

自分だったら、struct Vec4 { float x, y, z, w } のような共通の型を新たに定義し、ARTK_MMDとkinectで翻訳単位を分けてラップして、
ラッパーのインターフェイスにはVec4を使用して相互に利用できるようにすると思います。

つまりARTK_MMDとkinectのAPIを同時に利用する箇所では直接ライブラリのヘッダーをインクルードせずに、
ラッパーを利用することで衝突を回避します。


すこし強引ですがヘッダーファイルは書き換えずにオブジェクトファイルを書き換えるという方法もあります。
(ヘッダーの方の名前はインクルード先の#defineで書き換え)

タリック

Re: インクルードファイルでの再定義エラー

#3

投稿記事 by タリック » 12年前

返信ありがとうございます。
ラップと二重定義について解説しているサイトがあったので、
そちらを参考にしながら前者の方法で試していこうと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る