'C'에 해당되는 글 3건

  1. 2010.10.25 [C언어] a - b < 0 vs. a < b
  2. 2010.09.30 C로 수행시간 체크하기
  3. 2010.02.21 Header안에 static 변수
너무 간단한 건데, 이런걸 한번에 캐치하지 못했다.

수학시간에 배운데로 a -b < 0 은 a < b와 다를 바 없다.

하지만 프로그래밍 언어에서는?

꼭 그렇지는 않다.


위 간단한 코드를 출력해보면 무엇이 나올까?
출력 결과는
a < b
[end]

가 된다.
어찌 보면 당연한건데 막상 프로젝트에서 접하면 쉽게 발견하기 어려운 버그가 된다.
unsigned 인 a 와 b의 차를 계산하여 나온 결과가 음이 되므로 오버플로우에 의해서 a - b는 양이 된다.

이런 코딩을 하진 않겠지만 눈에도 익혀서 디버깅을 할 때 쉽게 찾을 수 있도록 노력해야겠다.



신고

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

linker 관련 링크  (0) 2011.04.15
calloc vs malloc  (6) 2011.04.06
[C언어] a - b < 0 vs. a < b  (0) 2010.10.25
C로 수행시간 체크하기  (0) 2010.09.30
__builtin_expect 키워드  (0) 2010.09.10
gcc 업그레이드 (4.5.0)  (0) 2010.07.21
Posted by 소혼
TAG C, 예제
간단하게 수행시간 체크하는 매크로를 만들어보았다.

### c++
#ifdef _WIN32
#define ENTER { \
    LARGE_INTEGER begin, end, freq; \
    QueryPerformanceFrequency(&freq); \
    QueryPerformanceCounter(&begin);
#define LEAVE \
    QueryPerformanceCounter(&end); \
    double elapsed_time = (double)(end.QuadPart - begin.QuadPart) / freq.QuadPart; \
    printf("%s:%d] %3.2f elapsed\n", __FUNCTION__, __LINE__, elapsed_time); \
#else
#include <sys/time.h>
#define ENTER { \
    struct timeval stime, etime; \
    unsigned int performed_time; \
    gettimeofday(&stime, NULL);
#define LEAVE \
    gettimeofday(&etime, NULL); \
    performed_time = etime.tv_sec - stime.tv_sec; \
    performed_time = performed_time * 1000000 + etime.tv_usec - stime.tv_usec; \
    printf("%s:%d] %d elapsed\n", __func__, __LINE__, performed_time); \
    }
#endif




신고

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

calloc vs malloc  (6) 2011.04.06
[C언어] a - b < 0 vs. a < b  (0) 2010.10.25
C로 수행시간 체크하기  (0) 2010.09.30
__builtin_expect 키워드  (0) 2010.09.10
gcc 업그레이드 (4.5.0)  (0) 2010.07.21
Header안에 static 변수  (0) 2010.02.21
Posted by 소혼
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
Header안에 static 변수  (0) 2010.02.21
디버깅하는 법 - 툴 - ltrace  (0) 2010.02.18
unresolved symbol 에 관하여  (0) 2010.01.27
[Python]파일명 바꾸기  (0) 2009.09.02
Posted by 소혼
TAG C, C++
이전버튼 1 이전버튼

티스토리 툴바