14

プロトコルを作成していますが、定義しているメソッドのパラメーターの 1 つがCMTime*. CMTimeそれを含めるのではなく、前方宣言したいと思います。ただし、試してみた@class CMTimeところ、別の場所で別のタイプのシンボルとして再定義されていると不平を言っています。ドキュメンテーションによると、それは構造体です。私はそれを次のように宣言しようとしました

struct CMTime;

しかし、それが何であるかわからないとまだ不平を言っています。

私が間違っていることはありますか?

4

3 に答える 3

18

ObjC としてコンパイルされたソースには、この点で C と同じ規則があります。

ObjC++ としてコンパイルされたソースには、この点で C++ と同じ規則があります。

@class MONClass;ObjC 型の前方宣言です。構造体には使用しないでください。

struct t_mon_struct;名前付きC または C++ 構造体の前方宣言です。ObjC タイプには使用しないでください。技術的には、コンパイラでは C++ クラスを構造体として前方宣言することもできます (もちろん、クラスがグローバル名前空間でも宣言されている場合)。

したがって、セマンティクスの根源はすべて C に帰着します (これが ObjC 変換であると仮定します)。ここで、ObjC と C++ について言及するのをやめます。

ここには、複雑さの一般的な原因がいくつかあります。

  • 構造体の名前空間
  • 構造体の宣言
  • ラベルの複数の定義を避ける

struct t_mon_struct;タグ付き構造体の前方宣言です。具体的には、構造体の名前空間に存在する名前です。

構造体名前空間に存在するタグ付き構造体:

struct t_mon_struct { int a; };

グローバル名前空間に typedef を持つ無名構造体:

typedef struct { int a; } t_mon_struct;

グローバル名前空間に typedef を持つタグ付き構造体:

typedef struct t_mon_struct { int a; } t_mon_struct;

CMTime次のように宣言されています。

typedef struct
{
    CMTimeValue    value;
    CMTimeScale    timescale;
    CMTimeFlags    flags;
    CMTimeEpoch    epoch;
} CMTime;

具体的には、グローバル typedef ラベルCMTimeは構造体名前空間の匿名構造体にバインドされ、その宣言が表示されない限り参照できません。

宣言CMTimeされていました:

typedef struct CMTime
{
    CMTimeValue    value;
    CMTimeScale    timescale;
    CMTimeFlags    flags;
    CMTimeEpoch    epoch;
} CMTime;

次に、前方宣言を使用して取得できた可能性がありますstruct CMTime

struct CMTime;
void foo(struct CMTime*);

そのように宣言されていないため#include、宣言するか、回避策を講じる必要があります。

構造体の typedef がそのタグと異なる場合、複雑さはさらに悪化します。typedef にバインドしたり、再宣言したりすることはできません (C の場合)。ただし、構造体の名前空間で名前を使用することで、こっそり回避できます。これは、一部のライブラリ作成者が非公開と見なすものです。

于 2012-02-02T22:48:03.547 に答える
0

前方宣言を持つファイルに構造体の内容を認識させたい場合は、定義されているヘッダー (複数の場所にある可能性があります) をインポートする必要があります。プロパティにアクセスする必要がない場合は、構造体を前方宣言できますが、それはその範囲です。

于 2012-02-02T22:09:24.203 に答える