複数のライブラリをリンクするときに構造体が衝突する
C++,開発環境はVisual Studio Professional 2013です,
ライブラリ1にxy座標の構造体
struct point {
int x;
int y; };
を定義しています.
ライブラリ2にも全く同じ構造体を定義しています.
ここで,あるプロジェクトからこれら2つのライブラリをリンクしようとしたら,
error C2011: 'point' : 'struct' 型の再定義
というコンパイルエラーが出ます.
ライブラリ1とライブラリ2にpoint構造体が記述された共通用のヘッダを参照させるという方法をとれば解決できるのでしょうが,この方法以外でこのエラーをなんとか回避する方法はないでしょうか.
構造体宣言は只の宣言であって実体をもたないため,中身が同じであればいくら記述が重複しても問題はないと聞いたことがあったので大丈夫だと思っていました.
また,ライブラリ1とライブラリ2のpoint構造体の名前それぞれpoint1,point2にするなど違うものにするという方法でも回避できるのでしょうが,下記のメインコード内でコメントアウトされている部分のように,構造体の中身が全く同じなので互換性を持たせられるようにしたいのです.
ちなみに,ライブラリ1,2はコンソールアプリケーション・空のプロジェクトで作成したあと,ソリューションのプロパティで「構成の種類」を「スタティックライブラリ(.lib)」にするという手順で作成しています.
以下,簡略コード
====ライブラリ1====
----lib1.h----
#ifndef _H1_
#define _H1_
struct point {
int x;
int y;
};
void print_lib1(struct point p);
#endif
----lib1.cpp----
#include "lib1.h"
#include <iostream>
void print_lib1(struct point p)
{
std::cout << "lib1 : " << p.x << ", " << p.y << std::endl;
}
=====ライブラリ2======
----lib2.h----
#ifndef _H2_
#define _H2_
struct point
{
int x;
int y;
};
void print_lib2(struct point p);
#endif
----lib2.cpp----
#include "lib2.h"
#include <iostream>
void print_lib2(struct point p)
{
std::cout << "lib2 : " << p.x << ", " << p.y << std::endl;
}
===メインコード===
----main.cpp----
#include "../../lib1/lib1/lib1.h"
#include "../../lib2/lib2/lib2.h"
int main(void)
{
struct point val;
val.x = 2;
val.y = 3;
print_lib1(val);
//print_lib2(val);
}