【问题标题】:Non-integral underlying type for enum枚举的非整数基础类型
【发布时间】:2013-02-27 15:31:28
【问题描述】:

我正在努力将 Objective-git 集成到我的项目中,但是当我在我的源代码中包含它们的标题时,我在它们的几个枚举声明中得到了这些错误:

objective-git/Classes/GTRepository.h:57:16: Non-integral type 'git_reset_t' is an invalid underlying type

这是有问题的代码:

typedef enum : git_reset_t {
    GTRepositoryResetTypeSoft = GIT_RESET_SOFT,
    GTRepositoryResetTypeMixed = GIT_RESET_MIXED,
    GTRepositoryResetTypeHard = GIT_RESET_HARD
} GTRepositoryResetType;

我将git_reset_t 更改为NSUInteger(typedef'd 为 unsigned long),这样就可以编译了,但我当然不想更改库文件。

Objective-git 在它自己的项目中编译得很好,我在该项目和我的项目之间的编译器设置上找不到任何显着差异。我可能会错过什么?

这是 Xcode 4.5,使用 Apple llvm 4.1 编译。

更新: 我错过的线索是错误只发生在 .mm 文件上,而 .m 文件很好,所以不知何故底层枚举类型在 C++ 中不起作用(即使我启用 C++11)。作为一种解决方法,我为我在该文件中使用的一个objective-git 类放置了一个虚假的最小@interface 声明,因此我不必包含标题,但我仍然想找到一个更简洁的解决方案。

【问题讨论】:

标签: objective-c c clang


【解决方案1】:

Google 出现 this file 包含以下内容:

typedef enum {
    GIT_RESET_SOFT  = 1, /** Move the head to the given commit */
    GIT_RESET_MIXED = 2, /** SOFT plus reset index to the commit */
    GIT_RESET_HARD  = 3, /** MIXED plus changes in working tree discarded */
} git_reset_t;

这是一个旧式枚举,int 是基础类型。但它不是int,它是一种独特的类型。而且它不是整数,也不能作为新式枚举的底层类型。

解决方法是使用typedef enum : int,或者如果您可以使用 C++ 并且想要额外说明,

typedef enum : std::underlying_type< git_reset_t >::type

我没试过,但你也可以在没有 C++ 的 ObjC 中尝试这个:

typedef enum : __underlying_type( git_reset_t )

【讨论】:

  • 但是鉴于在objective-git项目中编译没有错误,肯定有非代码解决方案。
  • @Uncommon 你确定他们使用的是完全相同的编译器版本吗?扩展的行为可能已经改变。这些东西的测试覆盖率可能很差,而且 ObjC 扩展很可能会演变为与 C++ 标准功能相同。
  • 是的,我确定我使用的编译器版本与 Objective-git 项目 (Apple llvm 4.1) 相同。
  • @Uncommon 您是否还清理了这两个项目以确保适当的编译器实际上正在处理所有源代码?
  • 我很确定更改编译器会强制对所有内容进行重新编译,但我刚刚清理并重建了良好的措施。没有变化。
猜你喜欢
  • 2018-07-04
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 2012-03-09
  • 2010-10-25
  • 1970-01-01
相关资源
最近更新 更多