c 기초질문임돠..
글쓴이: oranke / 작성시간: 금, 2004/12/24 - 10:37오전
1.test.h 파일
int global=0;
2.test_1.c
#include <stdio.h> #include "test.h" void main() { printf("global value %d\n", global); }
3.test_2.c
#include <stdio.h> #include "test.h" void test() { printf("global value %d\n", global); }
소스는 위와 같구여..
각각 컴파일 하고 링킹(cc test_1.o test_2.o -o test)
을 할때
WARNING: Duplicate symbols 라는
경고문구가 뜨는 데요..
왜 그런거죠?
참고로 test.h 파일에
int global=0;
이런식으로 초기화 하면 경고가 뜨는데
int global;
이런식으로 초기화를 하지 않으면
경고문구가 뜨지 않는 이유는 뭔가요?
Forums:
Re: c 기초질문임돠..
위의 코드를
이렇게 변경해 보세요~~^^
[code:1]#ifndef __TEST_H__#define __
에궁.. -_-;;global 변수의 초기화는 main 처음에 하세요
에궁.. -_-;;
global 변수의 초기화는 main 처음에 하세요..
Re: c 기초질문임돠..
즉 이렇게 하시면...
1.test.h 파일
2.test_1.c
3.test_2.c
이렇게 하면 잘되네요.. 테스트 해봤습니다..
그런데..
gcc 3.2에서 컴파일하니..
#define __TEST_H__ 는 이미 정의 되어 있네요..
내부적으로 사용하나 봅니다.. (.. )
그래서
#define __TEST_H__1 로 변경했습니다..
에궁.. 이렇게 빨리 답변을 주시니 정말 감사 합니다..그런데..
에궁.. 이렇게 빨리 답변을 주시니 정말 감사 합니다..
그런데.. 사용법이야..
에러가 나면 피해 가면 되지만...
왜..
Header 파일의 변수에 초기화를 해주면
duplicate 경고가 나는지 궁금합니다.
이나 명시적으로 초기화한 것만 틀리지
내부적으로 0값을 갔고 있을텐데..
왜 명시적으로 초기값을 주면 경고가 나는지요..?[/code]
-- 본질적인 이야기는 피해갔군요..[code:1]WARNING&
-- 본질적인 이야기는 피해갔군요..
말 그대로 심볼이 두번 정의 되었습니다..
test.h 를 두번 인크루드 되서 #ifndef로 막아놨습니다..
그런데 초기화는 잘모르겠네요... ( ..)
헤더에 변수 선언은extern int global;이렇게
헤더에 변수 선언은
extern int global;
이렇게 하시구요.
초기화는 한 파일에서만 합니다.
test_1.c에서
int global=0;
이렇게 했으면 test_2.c에서는 그냥 global=blah 쓰시면 되요.
C 외부정의 모델
c에는 여러가지 외부정의 모델이 있으며
표준 C 모델은 다음과 같습니다.
int i; /* 임시정의 */
ini i=0; /* 정의 */
extern int i; /* 선언 */
extern int i=0; /* 정의 */
( C언어 펀더멘탈 p.910 참조)
즉 초기치를 주면 정의가 되는겁니다.
그래서 링커는 정의가 두번이니까 경고를 주는거겠죠
저경우는 매크로 가드로 해결될경우가 아닌거 같은데요
두번 include 했을경우는 막아지겠죠...
자세한건 책이나 다른자료를 참고하세요
test.h[code:1]#ifndef __TEST_H__#d
test.h
test_1.c
test_2.c
전역변수를 두개의 파일에서 사용하고 싶으신 거라면 위처럼 하시면되요.
헤더 파일에 변수 선언하지 않습니다. 해선 절대 안된다는건 아니지만
소스 규모가 커지면 듀플리케이티드 심볼 같은 메시지 많이 나오죠.
(gcc니까 워닝이지 ads같은 암컴파일러였음 에러로 나오지 않을까 생각하네요)
Do you think that's the air you are breathing now?
댓글 달기