为C++开发人员声明和使用 C 中的枚举和结构

declaring and using enums and structs with C for C++ developers

本文关键字:枚举 结构 开发 声明 C++      更新时间:2023-10-16

我想知道什么时候应该将typedef与 C 中的结构/枚举一起使用。我相信同样的原则也适用于目标-C

假设我有这样的东西

@interface foo : UIViewController
...
enum PlayState {Start , Stop , Pause};
@end

然后在实现文件中我有这个

@implementation foo
-(void) SomeMethod : (PlayState) val  /// <----Eror : How do I set PlayState as a parameter
{
} 
@end

C 的乐趣...

在(Objective-)C中,由enum(或struct)定义引入的名称不是独立的,要使用它,您必须在它前面加上enum。所以你的例子可以写:

enum PlayState {Start , Stop , Pause};
- (void) SomeMethod:(enum PlayState)val

C 还允许使用 typedef 为任何类型的类型提供速记,因此您可以添加到上述内容中:

typedef enum PlayState PlayState;

请注意,两个PlayState是不同的 - 一个是enum标识符,另一个是类型名称 - C 总是可以从上下文中分辨出你的意思。

现在你可以只使用PlayState

- (void) SomeOtherMethod:(PlayState)val

(并且enum PlayState仍然有效)。

然后,C 允许您将enumtypedef合二为一,从而得到:

typedef enum PlayState {Start , Stop , Pause} PlayState;

最后,由于您现在PlayState作为类型名称,您可能永远不会使用enum PlayState因此 C 允许您删除标记:

typedef enum {Start , Stop , Pause} PlayState;

enum PlayState现在不再有效。

以上所有内容也适用于struct

更改枚举声明:

typedef enum : NSUInteger {
    Start,
    Stop,
    Pause,
} PlayState;