#ifndef S_H_
#define S_H_
struct Foo
{
int x;
};
#endif
위의 파일이 foo.h이고 다른 여러 파일들에 인클루드된다고 쳐보자
이렇게만 되어있으면 너가 경험한 중복 심볼 문제가 생길거 같냐?
안생긴다
#ifndef S_H_
#define S_H_
struct Foo
{
int x;
};
Foo _Foo; ///////// 추가된 부분
#endif
전역 변수 하나 추가해놔보자
에러 생기냐? 이땐 생기지
Foo 타입을 갖는 변수 _Foo가 중복됐다고 에러메세지가 뜨는데 넌 자꾸 Foo가 중복이라고 헛스윙하고 있는거야
Set.c 가 요구하는데 구조체 foo 라고 칩시다. main.c 도 요구하는게 구조체 foo 라고 칩니다. Set.o 를 만들수 있습니다. main.o 도 만들수 있습니다. 그런데 main.o 랑 Set.o 를 합칠 수 없어요 왜냐면 foo 가 중복 이 되니까.. 그러면 extern 을 사용하면 된다고 하셨는데, Set.c 에 extern 한다고 칩시다, 그러면 문제점이 Set.o 를 만들지 못합니다. 그렇지만 main.o 는 만들어집니다. 존재하지 않는 Set.o 오를 존재한다고 상상하시고 합치시면 안됩니다
1. 구조체 타입 자체는 중복되지 않음 그 타입을 갖는 변수병들이 중복되는 것 2. extern을 헤더파일에 하라고 말하는 거임 Set.c에 하는게 아니라
혼자만의 상상에서 벗어나서 C 기본 개념부터 좀 다시 익혀
.h에 구조체를 정의하고 extern으로 구조체 변수를 선언하셈. 그리고 .c에서 구조체 변수를 초기화하셈. - 훈다리 훈다리
자꾸 그러는데 리디파인 난다니깡ㅛ
구조체 리디파인 되서 extern 이 아니라고...차라리 기괴공학도 처럼 따로 빼야된다고...
지금 보니까 완전 또라이 새키임 - return 0;
해봐. 그럼 알꺼야
예를들어 구조체 타입명이 MyStruct라면 헤더에다가는 extern MyStruct ms; 이렇게 해놓고 다른 cpp 파일에서 MyStruct ms = 블라블라 이렇게 초기화해놓고 쓰면 되지 ....이게 님이 말한건데.. 다른 cpp 파일을 블라블라 하면, extern 을 한 것은 분한 컴파일을 못하는거 이해하심?
extern MyStruct me 를 하면, 그순간, extern 했기때문에 독립적인 컴파일을 할 수 없다.