多くのレガシー コードと、C で記述されたいくつかの外部ライブラリを含む、大きくて古い C++ アプリケーションがあります。これらのライブラリは、バグが見つかり、ベンダーがパッチを提供した場合にのみ更新されることはほとんどありません。これは先週 1 つのライブラリで発生し、新しいバージョンを統合すると、ライブラリをローカルで変更しないと (以前のバージョンで行ったようです)、ビルドが次のエラー メッセージで中断することがわかりました。
non-local function ‘static E* MyCls::myFct(<anonymous struct>*)’ uses anonymous type
これは、ライブラリが次のような多数のハンドル タイプを宣言しているためです。
#define _Opaque struct {unsigned long x;} *
typedef _Opaque Handle;
typedef _Opaque Request;
一部のクラスの関数シグネチャで使用します。
class MyCls {
public:
static void* myFct(Handle handle);
...
}
_Opaque 構造体には名前がないため、コンパイラは関数の適切な名前マングル名を作成できないため、上記のエラーが発生します。
これに対する現在の回避策は、構造体に明示的に名前を付けて、ライブラリ ヘッダー ファイルにパッチを適用することです。
//#define _Opaque struct {unsigned long x;} * //Replaced by typedef below!
typedef struct __Opaque {unsigned long x;} * _Opaque;
可能であればライブラリに触れたくないので、これは明らかに悪いことです。もう1つのさらに悪いオプションはvoid*
、すべての関数シグネチャで型を変換し、それぞれの型にキャストし直すことです。そして、影響を受けるすべての関数を純粋な C で書き直すという最悪の選択肢があります...
だから、私の質問は次のとおりです。ライブラリにパッチを適用するよりも良いオプションはありますか? 私が見落としている簡単な解決策はありますか?これを解決する最善の方法は何ですか?