4

我正在努力将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_tNSUIntegertypedef'd to unsigned long),这让它可以编译,但当然我宁愿不必更改库文件。

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

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

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

4

1 回答 1

1

谷歌发现这个文件包含这个:

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 )
于 2013-02-27T15:39:40.773 回答