- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在创建一个协议(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/
我有一个 JOGL 应用程序,我想以编程方式播放音频文件。这可能吗? 最佳答案 JOGL(以及一般的 OpenGL)不是音频库。也许你想要JOAL ? 关于java - 用 JOGL 发声?,我们在S
我是一名优秀的程序员,十分优秀!