2

新しい C++ で古い C ライブラリを使用しようとしています。

ライブラリのヘッダー ファイルは、D. Hanson の「C Interfaces and Implementations」の実装非表示イディオムを使用します。

#define T MyAST 

typedef struct T *T;

私が知る限り、これは C でコンパイルされます。これは、C では構造体名と typedef 名が異なる名前空間extern "C" { #include "MyAST.h" }にあるためですが、typedef と構造体名が同じ名前空間にあるため、明らかに C++ () ではコンパイルされません。

conflicting declaration 'typedef struct MyAST* MyAST'

私は構造体の定義をヘッダーに移動し、テクニックの使用をあきらめる運命にあると思いますが、私は本当にそうしたくありません (このイディオムは多くのコードで使用されていますが、私のものもそうでないものもあります)。ここをチェックして、誰かが洞察を持っているかどうかを確認してください。

PS: イディオムがわからない場合は、実装する C ファイルに構造体の定義を保持できるため、インターフェイス ( MyAST.h) のユーザーは構造体にアクセスできず、実装で関数を使用する必要があります。

4

1 に答える 1

6

正直なところ、ここでの唯一の目的がいくつかの古いライブラリ (更新されないと推測されます) を使用することである場合、C++ と古いライブラリの間に接着層を作成します。古いライブラリを使用するために C でコンパイルされた少量のラッパー コードを記述し、C++ でコンパイルされる C インターフェイスを新しい C++ コードに提供するだけです。

同じ名前を持つことは、2 つの異なることが将来のメンテナーの間で混乱を引き起こすだけであることを意味するので、インターフェース コードをいくつかのソース ファイルに分離しようとします。

最後に、ある時点でインターフェイスを実装から分離したいという気持ちは理解できますが、コード ユーザーがライブラリの条件に著しく違反しないことを信頼する必要があります。定義が離れています。

于 2012-04-20T05:19:31.887 に答える