【问题标题】:Obj-C enum redefinition errorObj-C 枚举重定义错误
【发布时间】:2013-04-30 16:08:58
【问题描述】:
typedef enum {
    artists = 0,
    artists_songs = 1,
    artist_albums = 2,
    albums = 3,
    album_songs = 4,
    tags = 5,
    tag = 6,
    tag_artists = 7,
    tag_albums = 8,
    tag_songs = 9,
    songs = 10,
    song = 11,
    playlists = 12,
    playlist = 13,
    playlist_songs = 14,
    search_songs = 15
} Methods;

typedef enum {
    artists = 0,
    albums = 1,
    songs = 2,
    tags = 3,
    playlists = 4    
} ReturnTypes;

我在返回类型的艺术家 = 0 行上不断收到错误,说艺术家已被重新声明。我不确定这是什么语法错误。有什么想法吗?

【问题讨论】:

  • 从任何一个枚举定义中删除artists,它表示应用程序中artist 常量的重复声明。

标签: objective-c enums


【解决方案1】:

语法错误是 artists 正在被重新声明!您已经在第一个枚举中声明了一次,现在您尝试在第二行再次声明它。这些枚举不是单独的类型;它们只是常量列表。不能有两个名为 artists 的常量。

这就是为什么 Cocoa 中的枚举具有令人讨厌的长而无聊的名称,例如 UITableViewCellStyleDefault。这样他们就不会互相冲突了。你应该做同样的事情,例如MyMethodsArtists 与 MyReturnTypesArtists.

【讨论】:

  • 哇,Obj-C 不区分?我不能像 Methods.artists 或 ReturnTypes.artists 那样做?
  • NS_ENUM 宏是 LLVM 4.0 中的新功能,它稍微改进了一些东西,允许编译器做一些更像是枚举类型检查的事情,但全局命名空间问题仍然存在。
  • @RyanCopley:不幸的是,C 没有命名空间。正常的hack是在标识符上使用前缀(例如return_artists或rt_artists)。
【解决方案2】:

您的两种枚举类型中都有“艺术家”。编译器不在乎它们是否具有相同的值,它会抛出一个错误。

尝试重新定义两者之一。对于所有其他重新定义的常量,您将遇到同样的问题。

【讨论】:

    【解决方案3】:

    enum 只是整数常量的语法糖。您不能在多个地方定义一个给定的标识符;在这种情况下,您试图在多个枚举中使用相同的名称。
    您可以尝试使用静态成员的类(粗略说明,未经测试的代码):

    @implementation MethodsEnum
    
    +(int)artists
    {
        return 0;
    }
    
    +(int)artists_songs
    {
        return 1;
    }
    
    // etc.
    
    @end
    
    @implementation ReturnTypeEnum
    
    +(int)artists
    {
        return 0;
    }
    
    +(int)albums
    {
        return 1;
    }
    
    // etc.
    
    @end
    

    请注意,我不推荐这种方法,但它确实模拟了 Java 的 enum 中似乎缺少的一些语言功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多