2014-03-13 2 views
0

은 내가 엑스 코드 5.1 바닐라 단일 뷰 프로젝트에 두 개의 파일을 추가 :이 "그룹의 재정의"오류 란 무엇입니까?

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

구조체의 이름을 바꾸려고 했습니까? – Milo

+0

구조체의 이름을 변경하면 오류가 발생합니다. 불행히도'struct group'은 다른 라이브러리에서 왔습니다. 기존 프로젝트를 iOS 7.1/Xcode 5.1로 업그레이드하기 전에 오류가 표시되지 않았습니다. – ohho

답변

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> 두 번째 그건 다음이 포함되어 모든 내장 NSObject, NSArray 같은 목표 - C 개체 - 및 파일 시스템 작업 사물의 무리, 따라서 권한 및 그룹 구성원을 처리 할 수 ​​있어야합니다. 그 중 하나가 grp.h을 포함합니다.

질문에 다시 회신하십시오. .pch 파일을 변경하여 Foundation/Foundation.h을 포함하지 않도록 변경 한 다음 필요할 때 수동으로 포함시킬 수 있습니다.

하지만 결국 모든 빌드가 느려질 것입니다. 여기에 파일 .pch은 특별합니다. Xcode는이 파일을 한 번 컴파일하고 바이너리 형식으로 저장하므로 빌드하는 모든 파일에 대해 확장되는 수천 줄의 C 코드를 구문 분석 할 필요가 없습니다.

내 충고는? 구조체의 이름을 다른 것으로 지정하십시오.

+0

불행히도'struct group'은 다른 라이브러리에서 왔습니다. 기존 프로젝트를 iOS 7.1/Xcode 5.1로 업그레이드하기 전에 오류가 표시되지 않았습니다. – ohho

0

grp.h는 이미 'group'구조체를 선언했습니다. 그래서 'group'구조체의 이름을 바꾸면 모든 것이 괜찮습니다. (예 : 'my_group')

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이 아니기 때문에이 파일을 가지고 있습니다 (이전 iOS 버전에서 동일한 코드가 작동 한 이유를 설명 할 수 있음).

좋은 소식은 * .pch 파일에서/usr/include 헤더를 제거해야하지만 실제로 필요한 위치에 파일을 포함 할 수 있으며 컴파일을 중단하지 않는다는 것입니다. 그것은 아마도 grp.h가 결국 그 파일에 포함되지만 그것이 당신의 table.c에 포함되지 않기 때문일 것입니다.