新しい 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
) のユーザーは構造体にアクセスできず、実装で関数を使用する必要があります。