2012-11-27 3 views
0

외부 구조체에 대해 혼란 스럽습니다. 구조체가 정의 된 것 이외의 파일에 구조체의 전역 인스턴스를 정의해야합니다 (정확히 무엇인지 정확히 모르는 RAM 변수로).외부 구조체 및 다중 헤더

다음은 GCC가 컴파일 할 수있는 예제이며 Code Composer Studio에서 컴파일 타임 오류가 발생하는 동안 올바르게 실행됩니다.

문제가있는 곳, GCC 컴파일 방법 및 어디에서/extern 선언을 사용해야하는지 배우고 싶습니다.

모든 의견을 보내 주시면 감사하겠습니다.

#ifndef PERSON_H 
#define PERSON_H 
struct person { 
    int age; 
}; 
typedef struct person PERSON; 
void modifyPerson(); 
#endif // PERSON_H 

personRam.h

#ifndef PERSONRAM_H 
#define PERSONRAM_H 
#include "person.h" 
PERSON p1; 
#endif // PERSONRAM_H 

modifyPerson.c

,536 person.h
#include "person.h" 
#include "personRam.h" 
void modifyPerson() { 
    p1.age = 10; 
} 

시스템을 대상으로 운영 체제를 당신이 컴파일에서하고있는 main.c에

#include <stdio.h> 
#include "person.h" 
#include "personRam.h" 
int main() { 
    modifyPerson(); 
    printf("%d", p1.age); 
    return 0; 
} 
+1

외부 구조하기 위해, 당신은 적어도 한 번 키워드'extern'를 사용해야합니다. 너는하지 않았다. 그렇다면 외부 구조는 어디에 있습니까? 아무데도. 해당 구조의 복제 인스턴스가 있습니다. GCC는 당신의 실수를 너무 용서하고 있습니다. –

+1

http://c-faq.com/decl/decldef.html – hmjd

+0

@Vlad Lazarenko 중복 된 부분은 어디에 있습니까? 나는 그것을 personRam.h에서 한 번 선언했다. 내가 잘못? – groove

답변

1

?

Linux (& Unix-es)와 Windows에는 서로 다른 연결 의미가 있습니다. 자세한 내용은 Levine's "Linkers & Loaders" 책을 읽으십시오.

+0

나는 GCC와 CCS가있는 DSP가있는 Windows를 목표로하는 MS Windows에 있습니다. – groove

3

컴파일러 오류가 발생하지 말고 p1이 여러 번 정의되었다는 링커 오류가 발생합니다. 적어도 그것은 내가 짐작할 때 문제 다.

이유는 변수를 헤더 파일에 정의한 다음 여러 소스 파일에 포함시키기 때문입니다. 이것은 정의가 두 소스 파일 모두에 있음을 의미합니다 (사전 처리기 #include 지시문은 include "statement"대신 헤더 파일의 내용을 문자 그대로 넣습니다).

당신이 헤더 파일에 extern로 변수를 선언 거기에 하나의 소스가 작동해야 파일을 정의합니다.

그래서 personRam.h

extern PERSON p1; 

에서 그리고 소스 파일 중 하나에서 :

PERSON p1; 
+0

내가 필요한 것은 _personRam.h_에'p1'을 정의하는 것입니다. 내가 할 수 있을까? 'p1'이 필요한 모든 파일에 _personRam.h_을 포함하는 대신,이 파일에'extern PERSON p1'을 사용해야합니다. 내가 잘못? 그런데 컴파일러 링커 오류에 대한 수정은 라이트입니다. – groove

+1

@groove 네, 그렇습니다.하지만 오히려 정의를위한'personRam.c' 소스 파일을 만들고 헤더 파일에'extern' 선언을하고 그 변수를 필요로하는 모든 파일에 헤더 파일을 포함 시켰습니다. –

+0

이제 내 _main.c_ 및 _modifyPerson.c_에는 _personRam.h_이 포함되지 않지만 'extern PERSON p1;'만있는 _globals.h_를 포함합니다. _personRam.h_에 'PERSON p1;'을 선언하면 오류가 발생합니다. 대신에 _personRam.c_를 추가했습니다.이 파일에는'#include "personRam.h"와'PERSON p1; '이 있습니다. 이것은 컴파일되지만, 여전히 나는 뭔가 잘못하고 있다고 느낍니다. (그래서 저는이 바보처럼 행동합니다.) – groove