|
위에 답글을 다시 이정구님이 물어보신 부분에 대해서는 잘 설명해주셨습니다만, 질문하신 분이 다른 위험요소를 안고 계신 것 같아서 추가답변을 적습니다.
header파일에 데이터를 선언(저장)하는 방법은 사용하지 마시길 바랍니다.
단지 Global.c라는 파일에서만 Global.h를 인클루드한다면, 별 상관이 없습니다.(꼭 Global.c라는 파일을 뜻하는 게 아니라 단 하나의 c파일에서 인클루드하는 것을 말합니다)
그러나 a.c, b.c등에서도 인클루드를 하신다면, 에러가 발생하거나 예기치않은 현상이 나옵니다.
1) 에러가 발생하는 경우
Global.h에
PERSON* g_listPerson[100];
과 같이 데이터를 선언하는 경우, 두 개 이상의 파일에서 이 헤더파일을 인클루드하면 같은 이름의 변수를 중복정의했으므로 에러가 발생합니다
2) 예기치않은 현상
Global.h에
static PERSON* g_listPerson[100];
과 같이 데이터를 선언하고, 두 개 이상의 파일에서 인클루드하여 사용하면, 잘 돌아가는 듯 보입니다.
그러나 a.c와 b.c에 각각 따로 저장된 메모리를 갖고 있는 것이므로, 공용으로 쓴다는 목적에 위배됩니다.
a.c에서 어떤 값을 추가하고, b.c에서 읽으면 a.c에서 추가한 값이 나오지 않는다는 말입니다(변수명은 같아도 a.c의 변수와 b.c의 변수는 다른 변수입니다.)
static이라는 키워드는 해당 c파일에서만 사용가능하므로 중복정의 문제는 발생하지 않으나, 데이터를 공용할 수 없고 괜히 메모리를 많이 먹게 되는 것이지요.
질문하신 분의 의도대로라면 헤더파일은 extern을 사용하는 그대로 사용하시고,
Global.c라는 파일을 추가하셔서 그 파일에
PERSON* g_listPerson[100];
를 넣는 게 바람직해 보입니다. 물론 Global.c에서 Global.h를 인클루드 해야겠지요. 함수는 없어도 아무 이상이 없습니다.
조금 더 낫게 프로그래밍을 한다면, 각 파일에서 g_listPerson을 직접 건드리게 되면 지저분하고 어딘가 한군데에서 잘못 사용한 경우 디버깅하기 힘드므로, Global.c에 해당 변수를 제어하는 함수를 만드는 게 좋습니다(물론 Global.h에 해당 함수들의 프로토타입이 추가되어야 합니다)
예를 들면,
void read_person(int index);
void write_person(int index);
이런 식으로요.
C초보 님이 쓰신 글 :
: Global.h 파일을 만들고 범용으로 사용되는 변수를 여기에 저장하려 합니다.
: 그런데
:
: typedef struct Person
: {
: int i;
: } PERSON;
:
: extern PERSON* g_listPerson[100];
:
: 이렇게 global.h 에 선언을 하면 컴파일도 잘되고 링크도 잘됩니다.
: 그런데 이걸 다른 곳에서 (예를 들어. a.cpp) 쓸려고 하면 컴파일은 잘되는데
:
: 링크 에러가 뜹니다.
: Unresolved external 이라고 하면서요..
: 이건 왜이런걸까요..
:
: 자주 있는 일인데 계속 모르고 넘어가다가 이번에는 대충 넘어가지말고 공부하자는 의미로
: 이렇게 여쭤봅니다.
:
: 이런때는 경험상 extern 대신 static으로 쓰면된다..
: 라고 익혔는데 왜그런지 알고싶습니다.
: 부탁합니다. 가르쳐주세요.
|