헤더에서 #ifndef 전처리를 해줬음에도 중복 선언이 되는 문제

yann8166의 이미지

만들어준 헤더에

#ifndef MAKE_DB
#define MAKE_DB

const char test[] = "abcd"'
(내용)

#endif

위와 같이 전처리기를 통해 헤더 내용을 감싸 주었습니다.

하지만 그럼에도 컴파일 시에 이 헤더를 include한 다른 위치에서

이미 test 상수를 선언 했다는 중복 에러가 출력이 됩니다.

static const char test[] = "abcd"와 같이 static을 주어야만 정상 컴파일이 됩니다.

무슨 이유일까요??

dgkim의 이미지

컴파일전 전처리결과를 파일로 떨궈서 확인해 보는 것은 도움이 될까요?

http://www.dgkim.net/wordpress/2013/01/03/gcc로-몇가지-연습-c-s-e/

klara의 이미지

include는 그냥 복붙하는거랑 똑같습니다. 서로다른 소스파일에서 저 해더를 인클루드하면 각각에서 똑같은 이름의 전역변수가 선언되므로 충돌됩니다.

qiiiiiiiip의 이미지

1. 선언과 정의는 다릅니다.
2. 중복 선언 에러는 없습니다.. ( 타입을 다르게 선언하면 오류가 납니다만.. )
3. 헤더에는 선언만, 정의는 한 곳에서만 하시면 됩니다.

mirheekl의 이미지

해당 변수는 해당 소스파일(cpp등)에서만 사용이 가능하므로 에러가 사라지는 것입니다.
개인적으로는 헤더파일에서 변수를 선언하는 걸 가급적 피하고 있습니다. 저 경우에는 #define을 이용했다면 아무 문제가 없겠죠.

--