我在Xcode 5.1 vanilla单视图项目中添加了两个文件:
table.h
struct group {
int size;
};
table.c
#include "table.h"
并收到此错误:
Semantic issue
table.h:2:8: Redefinition of 'group'
"以前的定义"是:
iOS 7.1 > usr/include > grp.h
我想知道为什么这个grp.h
会自动包含在我的项目中。我怎么能不包含它?
答案 0 :(得分: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代码。
我的建议?将您的结构命名为其他内容。
答案 1 :(得分:1)
通常情况下,更改结构的命名会更容易,但是因为它来自另一个库,所以这是我的解决方案。
事实证明,如果您允许.pch文件包含iOS 7.1中的任何头文件&gt; / usr / include然后它将引用(包括?)更多,包括导致项目中的问题的grp.h。
例如,如果您的.pch文件包含以下内容:
#import <Availability.h>
然后grp.h会引起冲突。
如果你注释掉这一行(并且不包含来自&#34; iOS 7.1&gt; usr / include&#34;)的任何其他标题,那么你的项目将会编译。
作为测试,您可以注释掉<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则没有(这可以解释为什么相同的代码适用于早期的iOS版本)。
好消息是,虽然您需要从* .pch文件中删除/ usr / include标头,但您仍然可以将它们包含在您实际需要它们的文件中,并且不会破坏编译。这可能是因为尽管grp.h最终将被包含在这些文件中,但它不会被包含在你的table.c中。
答案 2 :(得分:0)
grp.h已经声明了一个名为'group'的结构, 所以你只需要重命名你的'组'结构,一切都会好的。 (例如'my_group')