2016-11-17 19 views
0

は、私は、それぞれ外部C++とCライブラリのヘッダファイルされている C++の名前空間の競合

// prj_cpp.h 
#include "lib_cpp.h" 
extern "C" { 
#include "lib_c.h" 
} 

lib_cpp.hlib_c.h

として始まり prj_cpp.hC++プロジェクトを開発しています。

外部C++ライブラリlib_cpp.hも次のようにlib_cを使用しています。 lib_c.hは二重の混入を防ぐ

// lib_cpp.h 
namespace SOME_WEIRD_NAMESPACE { 
extern "C" { 
#include "lib_c.h" 
} 
} 

ので、lib_c.h内のすべてのオブジェクトは、私のプロジェクトprj_cppとは何の関係もありませんSOME_WEIRD_NAMESPACEに存在していることが判明しました。私が最初にlib_c.hが含まれているためSOME_WEIRD_NAMESPACE下には何もありませんので、一方

私のヘッダファイルが

// prj_cpp.h 
extern "C" { 
#include "lib_c.h" 
} 
#include "lib_cpp.h" 

のように見える場合は、私が外部C++プロジェクトを破ります。

私はどちらもlib_cpp.hlib_c.h

変更することは許されないのです、このような問題を解決するために、私は私のprj_cpp.hに何かできることはありますか?

私のプロジェクトではSOME_WEIRD_NAMESPACEを大変好きではありません。なぜなら、その名前空間はそれとは関係がないからです。さらに、lib_c.hヘッダーファイルの数は大きくなる可能性があります。

+2

lib_cpp.hが壊れています。これが基本的な問題であり、それを修正するのが正しい方法です。 –

+0

合意された、適切な修正は何でしょうか?名前空間でlib_c.hを使用できないようにしますか? – TruLa

+0

lib_cpp.hとlib_c.hの新しいバージョン(壊れていないもの)を作成し、オリジナルの代わりに使用します。オリジナルは修正されていないので、割り当て仕様はまだ満たされています。 – user4581301

答えて

1

あなたがlib_c.h以上lib_cpp.h使用する場合は、次のラッパーとの#include lib_c.hを置き換える:あなたはlib_cpp.h使用よりもlib_c.h次のラッパーを使用する場合は

// lib_c_wrapper.h 
namespace SOME_WEIRD_NAMESPACE { 
extern "C" { 
#include "lib_c.h" 
} 
} 

// lib_cpp_wrapper.h 
#define SOME_WEIRD_NAMESPACE YOUR_NAMESPACE 
#include "lib_cpp.h" 

これは、この問題を解決するための回避策です。

2

lib_cpp.hとlib_c.hはサードパーティのものであり、これらのライブラリの新しいバージョンでこれらのファイルの新しいバージョンが提供される可能性があります。また、あなたの仕様はあなたがそれらを変更しないということを述べています。したがって、それらをラップし、問題を解決するためにコード内のラッパーを排他的に使用します。私に起こる

最初のアプローチは、次のとおりです。

//wrapped_lib_c.h 
#ifndef WRAPPED_LIB_C_INC_GUARD 
#define WRAPPED_LIB_C_INC_GUARD 

namespace SOME_WEIRD_NAMESPACE 
{ 
    extern "C" 
    {  
    #include "lib_c.h" 
    } 
} 

namespace SOME_PROJECT_APPROPRIATE_NAMESPACE 
{ 
    using SOME_WEIRD_NAMESPACE; 
} 

#endif 

//wrapped_lib_cpp.h 
#ifndef WRAPPED_LIB_CPP_INC_GUARD 
#define WRAPPED_LIB_CPP_INC_GUARD 

#include "lib_cpp.h" 

namespace SOME_PROJECT_APPROPRIATE_NAMESPACE 
{ 
    using SOME_WEIRD_NAMESPACE; 
} 
#endif 

本のいくつかのバリエーションがあなたの状況のた​​めに働く必要があり、あなたが維持するために必要な詳細情報は、あなたのラップで単離されますファイル。

関連する問題