8

私がインクルードした 2 つのヘッダー ファイルを取得しましたが、どちらも同じ名前の typedef を持っています。

aaa.h と bbb.h としましょう。それらは 2 つの無関係なサードパーティ パッケージからのものであり、これら 2 つのファイルを制御することはできませんが、使用する必要があります。両方のファイルを直接インクルードするわけではありませんが、最上位のヘッダー ファイルにサブインクルードされます。(つまり、それぞれを含む ah と bh を含めます)

名前の競合により、両方が含まれているとプログラムがコンパイルされません。

したがって、私の一時的な解決策は、myaaa.h と呼ばれる typedef のみを削除して、aaa.h をソース ツリーにコピーすることです。ファイルの先頭で、「#ifndef AAA_H, #define AAA_H」ラッパーをそのままにしておくので、myaaa.h をインクルードすると、AAA_H フラグが既に定義されているため aaa.h はインクルードされず、typedef の競合が間接的に削除されます。

そのようなファイルをソースに追加せずにこれを行うより賢い方法はありますか (そして、バージョン管理する必要があります)。

ありがとう!

4

1 に答える 1

13
#define conflicting_typedef aaa_conflicting_typedef
#include "aaa.h"
#undef  conflicting_typedef
#define conflicting_typedef bbb_conflicting_typedef
#include "bbb.h"
#undef  conflicting_typedef
#define conflicting_typedef ambiguous use aaa_conflicting_typedef or bbb_conflicting_typedef

typedeffromを参照する必要がある場合はaaa.h、名前を使用できますaaa_conflicting_typedeftypedeffromを参照するにはbbb.h、 name を使用しますbbb_conflicting_typedeftypedefコード内でどちらも参照する必要がない場合は (おそらくそうですが)、問題ありません。最後#defineに、プレーンな名前を使用しないようにします。正しいマップ名を使用する必要があります。

明らかに、これは繰り返されるべきではありません。このスタンザを必要とするファイルが複数ある場合は、それを独自のヘッダー「aaa_bbb.h」に入れ、スタンザが必要な場所に含めます。aaa.hまたはbbb.hが既に含まれているかどうかを検出し、含まれている場合はコンパイルを拒否することもできます (この後に含まれているかどうかは検出できませんが、一度自分の管理下に含まれているという事実は、それらが含まれてはならないことを意味します)。再び含まれています)。

これが C++ の場合、タイプ セーフなリンケージのため、より大きな問題が発生します。OTOH、ライブラリベンダーは両方とも不適切な名前空間制御の罪を犯しています。

于 2012-09-05T23:56:34.690 に答える