'C++'에 해당되는 글 3건
- 2008/10/23 C++의 #ifdef _DEBUG 대용 매크로.(1)
- 2008/10/02 명시적 반복문 한계치 지정 매크로 for C/C++, 혹은 무한 루프 방지
- 2008/03/18 C++0x 미리보기
작성자: yagur rev: 1
_D는 디버깅시 실행할 코드이고 _R은 릴리즈시 실행할 코드입니다.
_R/*, _R*/는 릴리즈시 해당 블럭을 주석처리 하는 것입니다. 디버깅시엔 주석처리 되지 않습니다. 디버깅 코드를 항상 주석처리로 보이게 하고싶으신분께 약간 흥미로울수도 있겠군요. 반대로 _D/* , _D*/ 로 사용하실수도 있습니다.
결과는 대충 예측하지만, 컴파일후 실행결과가 정확히 어떤지 궁금하신분은 아래 더보기를 누르세요.
# define __SLASH(x) /##x
# define __DOUBLE_SLASH __SLASH(/)
#ifdef _DEBUG
# define _D
# define _R __DOUBLE_SLASH
#else
# define _D __DOUBLE_SLASH
# define _R
#endif
int main(const int iArg, char* ppArg[])
{
printf("Hello ");
_D printf("Debug Mode\n");
_R printf("Release Mode\n");
_R/*
printf("Another Debugging code Start\n");
printf("That code ends here!!\n");
_R*/
getch();
return 0;
}
# define __DOUBLE_SLASH __SLASH(/)
#ifdef _DEBUG
# define _D
# define _R __DOUBLE_SLASH
#else
# define _D __DOUBLE_SLASH
# define _R
#endif
int main(const int iArg, char* ppArg[])
{
printf("Hello ");
_D printf("Debug Mode\n");
_R printf("Release Mode\n");
_R/*
printf("Another Debugging code Start\n");
printf("That code ends here!!\n");
_R*/
getch();
return 0;
}
_D는 디버깅시 실행할 코드이고 _R은 릴리즈시 실행할 코드입니다.
_R/*, _R*/는 릴리즈시 해당 블럭을 주석처리 하는 것입니다. 디버깅시엔 주석처리 되지 않습니다. 디버깅 코드를 항상 주석처리로 보이게 하고싶으신분께 약간 흥미로울수도 있겠군요. 반대로 _D/* , _D*/ 로 사용하실수도 있습니다.
결과는 대충 예측하지만, 컴파일후 실행결과가 정확히 어떤지 궁금하신분은 아래 더보기를 누르세요.
더보기
'개발 > 조각코드' 카테고리의 다른 글
| C++의 #ifdef _DEBUG 대용 매크로. (1) | 2008/10/23 |
|---|---|
| 명시적 반복문 한계치 지정 매크로 for C/C++, 혹은 무한 루프 방지 (0) | 2008/10/02 |
작성자 : yagur rev : 1
다른분들은 어떤지 모르겠지만, 전 가끔 무한 루프에 빠지는 실수를 하곤합니다. 루프 횟수가 상수가 아니라 가변값인 경우에도 종종 애를 먹기도 합니다. 그래서 루프의 최대 반복 횟수를 단정지어 버리는 매크로를 만들어봤습니다. 이 확장된 _for, _while문은 명시적으로 지정한 반복 한계치에 도달하면 오류(assertion fail)를 발생시킵니다.
소스코드
Debug 모드에서 NO_INFINIT_LOOP_CHECK를 소스의 처음에 define 시켜주거나, C++ 전처리기에 넣으면 원래 반복문을 사용합니다(오버헤드가 없습니다.). Release모드에서는 루프 반복 한계치 검산이 동작하지 않으므로 오버헤드가 없습니다. 버그가 생기면, 알려주시면 감사하겠습니다.
사용법은 내장 for, while문과 아주 약간 다릅니다.
C++ 기본 for, while의 예
알고리즘 중에 최악의 경우나, 명세에 따른 최대 횟수(ex> Θ(N))같것을 명시적으로 코드에 적어주는 용도로 생각하셔도 괜찮을것 같습니다.
다른분들은 어떤지 모르겠지만, 전 가끔 무한 루프에 빠지는 실수를 하곤합니다. 루프 횟수가 상수가 아니라 가변값인 경우에도 종종 애를 먹기도 합니다. 그래서 루프의 최대 반복 횟수를 단정지어 버리는 매크로를 만들어봤습니다. 이 확장된 _for, _while문은 명시적으로 지정한 반복 한계치에 도달하면 오류(assertion fail)를 발생시킵니다.
소스코드
#define LOOP_ASSERT assert
#if defined(_DEBUG) && !defined(NO_INFINIT_LOOP_CHECK)
#define _while(condition, maxLoop) \
for(unsigned int __LoopCounter = 0; \
condition; \
__LoopCounter++, LOOP_ASSERT(__LoopCounter != maxLoop))
#else
#define _while(condition, maxLoop) \
for(;condition;)
#endif
#if defined(_DEBUG) && !defined(NO_INFINIT_LOOP_CHECK)
#define _for(initialize, condition, loop, maxLoop) \
if(unsigned int __LoopCounter = 0 || true) \
for(initialize; condition && __LoopCounter < maxLoop; \
loop, __LoopCounter++, LOOP_ASSERT(__LoopCounter != maxLoop))
#else
#define _for(initialize, condition, loop, maxLoop) \
for(initialize; condition; loop)
#endif
#if defined(_DEBUG) && !defined(NO_INFINIT_LOOP_CHECK)
#define _while(condition, maxLoop) \
for(unsigned int __LoopCounter = 0; \
condition; \
__LoopCounter++, LOOP_ASSERT(__LoopCounter != maxLoop))
#else
#define _while(condition, maxLoop) \
for(;condition;)
#endif
#if defined(_DEBUG) && !defined(NO_INFINIT_LOOP_CHECK)
#define _for(initialize, condition, loop, maxLoop) \
if(unsigned int __LoopCounter = 0 || true) \
for(initialize; condition && __LoopCounter < maxLoop; \
loop, __LoopCounter++, LOOP_ASSERT(__LoopCounter != maxLoop))
#else
#define _for(initialize, condition, loop, maxLoop) \
for(initialize; condition; loop)
#endif
Debug 모드에서 NO_INFINIT_LOOP_CHECK를 소스의 처음에 define 시켜주거나, C++ 전처리기에 넣으면 원래 반복문을 사용합니다(오버헤드가 없습니다.). Release모드에서는 루프 반복 한계치 검산이 동작하지 않으므로 오버헤드가 없습니다. 버그가 생기면, 알려주시면 감사하겠습니다.
사용법은 내장 for, while문과 아주 약간 다릅니다.
C++ 기본 for, while의 예
for(int i = 0; i < 42; i++)
{
...
}
while(true)
{
....
}
확장된 for, while의 예{
...
}
while(true)
{
....
}
const unsigned int uiMaxLoop = 100000;
_for(int i = 0, i < uiRepeat, i++, uiMaxLoop)
{
....
}
_while(i < uiRepeat, uiMaxLoop)
{
....
}
_for(int i = 0, i < uiRepeat, i++, uiMaxLoop)
{
....
}
_while(i < uiRepeat, uiMaxLoop)
{
....
}
알고리즘 중에 최악의 경우나, 명세에 따른 최대 횟수(ex> Θ(N))같것을 명시적으로 코드에 적어주는 용도로 생각하셔도 괜찮을것 같습니다.
'개발 > 조각코드' 카테고리의 다른 글
| C++의 #ifdef _DEBUG 대용 매크로. (1) | 2008/10/23 |
|---|---|
| 명시적 반복문 한계치 지정 매크로 for C/C++, 혹은 무한 루프 방지 (0) | 2008/10/02 |
저와 지인들 사이에서 번역 공장으로 알려진 류광님의 C++Ox 미리보기입니다. 차기 표준에 관심이 있으신분들이 보시면 흥미로운것들이 많습니다.
- 2007/11/11 C++0x(차기 C++ 표준) 미리보기 1, 널 포인터의 이름은 nullptr (4)
- 2007/11/19 C++0x 미리보기 2, 오른쪽 꺾음괄호들(>>) (4)
- 2007/12/04 C++0x 미리보기 3, 템플릿 별칭 (1부)
- 2007/12/08 C++0x 미리보기 3, 템플릿 별칭 (2부) (2)
- 2008/01/31 C++0x 미리보기 4, 새로운 열거형 (4)
- 2008/03/09 C++0x 미리보기 5, 정적 단언문 (2)
- 2008/04/01 C++0x 미리보기 6, 확장된 friend 선언
- 2008/05/31 C++0x 미리보기 7, 가변인수 템플릿
- 2008/08/21 C++0x 미리보기 8, 위임생성자
- 2008/11/09 C++0x 미리보기 9, 상속생성자
- 2008/12/31 C++0x 미리보기 10, 범위기반 for 루프
- 2009/05/08 C++0x 미리보기 11, auto의 새로운 용법
- 2009/06/27 C++0x 미리보기 12, 표현식의 형식을 알려주는 decltype
- 2009/08/30 C++0x 미리보기 13. Concepts는 다음기회로(1부)
- 2009/09/13 C++0x 미리보기 14. Concepts는 다음기회로(2부)
그 외에도 오른쪽 링크에 많은 사항들이 고려되고 있습니다. [open-std.org 링크]
'웹항해일지' 카테고리의 다른 글
| C#으로 된 OS. Singularity (0) | 2008/03/22 |
|---|---|
| C++0x 미리보기 (0) | 2008/03/18 |
| O'Reilly Maker라는 재미있는 곳입니다. (3) | 2008/02/17 |
| Maya 2008 가 출시되는군요. (0) | 2007/08/27 |
| TSearch2 가 PostgreSQL 코어에 공식 포함됩니다. (0) | 2007/08/23 |
| Euphoria는 대단한 물리 엔진이군요. (0) | 2007/06/06 |








Recent Comment