프로그래밍 언어/C/C++

Header안에 static 변수

소혼 2010. 2. 21. 18:44
반응형
C++에서 static을 다소 헷갈리게 만드는 요소가 있긴 하지만,

header에서 static 변수를 선언해서는 안된다.

static : 지역 변수임을 알려주는 키워드 (C++ 클래스 내부의 static과 다른 의미이다.)

헤더에서 static을 선언하면 어떤 일이 일어날까?
간단한 예제를 만들어보았다. (컴파일 없이 손코딩했음)


common.h
static int gvalue = 10;


main.c
#include <stdio.h>
#include "common.h"
#include "b.h"

int main () {
    printf("%d\n", gvalue);
    call_b();
    printf("%d\n", gvalue);
    return 0;
}

b.h
void call_b();

b.c
#include "common.h"

void call_b() {
    gvalue++;
}

간단한 예제인데, 이 때 출력되는 값은 얼마일까?
10과 11이 출력되길 기대하겠지만 안타깝게도 10과 10이 출력이 된다.
이유는 gvalue가 main.c와 b.c에 각각 따로 존재하기 때문이다.
nm으로 바이너리를 까보면 gvalue를 위해 두개의 심볼이 존재하는 것을 알 수 있다.
즉, b.c가 증가시킨 gvalue는 main.c에 보이지 않는 b.c를 위한 지역변수가 된다.

그럼 이런 실수를 왜 할까?
C++로 넘어오면서 일부 책에서 #define을 쓰지 말고 const를 쓸것을 권장하고 있다. 이러한 상수형(?) 변수를 쓰는 것이 debugging에 도움이 될 수 있고 그다지 성능을 많이 잡아먹지 않을 것이라는 것은 안다.(제대로 짰을때에 한해서)
이렇게 만들어진 const를 그냥 header에 넣으면 분명 에러가 발생한다. 이유는 헤더가 동일한 상수형 변수를 여기저기 만들기 때문이다.운
거기서 포기하지 않고 static을 붙이면 컴파일은 되겠지만, 나중에는 찾기 어려운 재앙이 될 수 있다.
반응형

'프로그래밍 언어 > C/C++' 카테고리의 다른 글

__builtin_expect 키워드  (0) 2010.09.10
gcc 업그레이드 (4.5.0)  (0) 2010.07.21
디버깅하는 법 - 툴 - ltrace  (0) 2010.02.18
unresolved symbol 에 관하여  (0) 2010.01.27
[Python]파일명 바꾸기  (0) 2009.09.02