gpt4 book ai didi

objective-c - 在 Objective-C 中转发声明一个结构

转载 作者:太空狗 更新时间:2023-10-30 03:19:04 26 4
gpt4 key购买 nike

我正在创建一个协议(protocol),我正在定义的方法的参数之一是 CMTime*。我想转发声明 CMTime 而不是包含它。但是,我已经尝试过 @class CMTime 并且它提示它在别处被重新定义为不同类型的符号。文档说它是一个结构。我已经尝试将其声明为

struct CMTime;

但它仍然提示它不知道它是什么。

知道我做错了什么吗?

最佳答案

编译为 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 绑定(bind)到结构命名空间中的匿名结构,除非其声明可见,否则不得引用。

如果声明了 CMTime:

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

那么你可以通过使用前向声明 struct CMTime 获得:

struct CMTime;
void foo(struct CMTime*);

由于它没有以这种方式声明,因此您需要#include 它的声明,或者设计一个解决方法。

当结构的 typedef 与其标签不同时,问题会变得更糟。您不能绑定(bind)或重新声明 typedef(在 C 中)。但是,您可以通过使用结构命名空间中的名称来绕过它——一些库作者认为这是私有(private)的。

关于objective-c - 在 Objective-C 中转发声明一个结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9120525/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com