0

我在 Xcode 5.1 vanilla 单视图项目中添加了两个文件:

表.h

struct group {
    int size;
};

表.c

#include "table.h"

并得到这个错误:

Semantic issue
table.h:2:8: Redefinition of 'group'

“以前的定义”是:

iOS 7.1 > usr/include > grp.h

我想知道为什么这grp.h会自动包含在我的项目中。我怎么能包括它?

4

3 回答 3

5

grp.h是定义一些基本数据结构的标准 Unix 级文件之一;在这种情况下,struct group是处理用户权限的低级 C 函数返回的内容。

至于为什么将它包含在您的项目中的问题:当您在 Xcode 中创建一个新项目时,它会创建一个包含文件,该文件会隐式包含在您项目中的每个.m.c文件中。在我刚刚创建的项目中,它位于文件浏览器中的一个名为 的组中Supporting Files,名称类似于[project]-Prefix.pch. 我的有以下内容:

#import <Availability.h>

#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif

倒数第二行,#import <Foundation/Foundation.h>然后包括所有内置的 Objective-C 对象,如NSObject, NSArray- 以及与文件系统一起工作的一堆东西,因此需要能够处理权限和组成员资格。其中之一就是包括grp.h.

所以,回到您的问题 - 您可以将.pch文件更改为不包含Foundation/Foundation.h,然后在需要的地方手动包含它。

但这最终会减慢您的所有构建速度。这里的.pch文件比较特殊;Xcode 将其编译一次并以二进制格式保存,因此它不必为您构建的每个文件解析它扩展为的数千行 C 代码。

我的建议?将您的结构命名为其他名称。

于 2014-03-17T02:02:58.187 回答
1

通常,更改结构的命名当然会更容易,但是由于它来自另一个库,因此这是我为您提供的解决方案。

事实证明,如果您允许您的 .pch 文件包含来自 iOS 7.1 > /usr/include 的任何头文件,那么它将引用(包含?)更多,包括导致项目问题的 grp.h。

例如,如果您的 .pch 文件包含以下内容:

#import <Availability.h>

那么grp.h会引起冲突。

如果您注释掉这一行(并且不包含“iOS 7.1 > usr/include”中的任何其他标题),那么您的项目将编译。

作为测试,您可以注释掉<Availability.h>并添加#import <cpio.h>,结果将是相同的(尽管 cpio.h 非常小并且不引用任何其他头文件)。

我不太擅长理解编译的内部结构,所以我无法解释为什么会发生这种情况,但我将问题追溯到这个文件: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk/usr/include/module.map它似乎将各种 Darwin 头文件组合在一起。

iOS 7.0 和 iOS 7.1 都有这个文件,而 iOS 6.0 没有(这可以解释为什么相同的代码可以在早期的 iO​​S 版本上工作)。

好消息是,尽管您需要从 *.pch 文件中删除 /usr/include 头文件,但您仍然可以将它们包含在您实际需要它们的文件中,并且不会破坏编译。这可能是因为尽管 grp.h 最终会包含在这些文件中,但它不会包含在您的 table.c 中

于 2014-03-21T10:02:05.370 回答
0

grp.h 已经声明了一个名为“group”的结构,所以你只需要重命名你的“group”结构,一切都会好的。(例如“我的组”)

于 2014-03-17T02:15:47.707 回答