2011년 6월 20일 월요일

난 assert() 대신 int 3를 쓴다.


물론 C 언어에서 제공하는 assert() 함수가 있다. 하지만 난 이걸 사용하지 않는다. 이 함수가 제공하는 callstack 꼬라지가 맘에 안들어서... -_-  assert()에 실패한 코드라인이 callstack 젤 위에 등장해야 하는데 도무지 그러지가 않으니까.. 물론 callstack을 적당히 조작해서 assert()에 실패한 라인을 젤 위에 나오게 하는 꽁수도 있으나.. 매우 복잡해서 생락.... 대신 난 다음과 같은 ASSERT() 매크로를 만들어 사용한다.

#define ASSERT(expr, ...) if(!(expr)) __asm{ int 3 }

이 매크로가 하는일은 ASSERT에 실패할 때 그냥 코드 실행을 중지(break)하는 것... 이걸 사용하는 예는 다음과 같다.

ASSERT( life == sucks, "인생이 x같지 않다니 말이 되냐!?");

위의 문자열 메시지는 프로그래머가 코드 읽는데 도움이 되라고 있는 것.. 위 ASSERT()가 실패하면 디버거 에서 저 코드라인이 등장하니 그냥 문자열을 읽는 것만으로도 뭐가 문제인지 알수 있다.

이 방법은 하드웨어 인터럽트를 사용하므로.. PC에서만 돈다.. PowerPC 계열의 CPU에서 돌릴려면 다음과 같이 해야한단다.

#define ASSERT(expr, ...) if(!(expr)) asm{trap}

즐 코딩?

2011년 6월 10일 금요일

char* 문자열 버퍼 초기화의 내부


내가 예전에 문자열을 초기화 하던 방법:

char temp[64];
temp[0] = 0;

몇년전에 캡콤 밴쿠버에서 일할 때, 동료 프로그래머 하나가 다음의 방법이 더 낫다고 귀뜸해줬다.

char temp[64] = {0, };

그 친구가 이 방법이 나은 이유를 말해줬던거 같은데 사실 기억은 안나고... -_- 그냥 그 뒤로 줄곧 이 방법을 사용해왔다. 뭐 더 나은 방법이라니까.... 근데 최근에 우연히 이 방법이 왜 더 나은지를 알게되었다.

Xbox 360에서 프로파일 캡춰를 하던 도중 위의 코드가 컴파일되면 어떻게 변하는지를 찾아냈으니... 그건 바로 다음과 같다:

char temp[64];
memset(temp, 0, sizeof(char) * 64);

흥미로운 사실.. memset이 호출된다. 이 방법은 5~10 마이크로세컨드 정도가 걸리는데 사실 뭐 그리 걱정할 정도는 아니다. 근데 생각해보면 char 버퍼 선언뒤에 곧바로 strcpy 등의 함수를 호출한다면 굳이 위와 같은 초기화는 할 필요가 없다고 생각된다. (뭐가되든 null 캐릭터가 들어가기만 하면 되니까...)

2011년 6월 3일 금요일

코딩 컨벤션과 IDE 커스터마이제이션


코딩 컨벤션이라.. 언제나 코드를 어떻게 포맷해야 하는지에 대한 논란이 참 많은 것 같다. 사실 이건 대부분인 개인적인 기호라서 다른 사람들이 어떤 코딩 컨벤션을 따르던 별로 신경 쓰지 않는다.

내가 따르는 코딩 컨벤션은 사실 매우 간단하다. 비주얼 스튜디오의 자동완성(auto-complete)가 하는 방법을 그냥 따른다. 물론 비주얼 C++의 자동완성 기능이 C# 버전만큼 뛰어나진 않지만 그럴 경우에는 그냥 비주얼 C#의 자동완성이 사용하는 방법을 따른다. (참고로 업무를 할 때 C++뿐만 아니라 C#도 많이 사용해서 두 언언 모두에 동일한 코딩 컨벤션을 사용하는게 맘이 편하다..) 자세히 살펴보진 않았지만 아마 비주얼 스튜디오의 자동완성 규칙(rules)을 바꿀 수 있으리라 생각한다. 하지만 몇시간씩이나 시간을 들여서 이런 설정을 바꾸는건 개인적으로 좀 시간 낭비라 생각한다.

IDE 커스터마이제이션도 마찬가지다. 직장 동료 게임 프로그래머중에 아직도 비주얼 C 6의 키보드  단축 키를 사용하는 놈들이 많은 걸 보면 상당히 놀랍다. 그래서 그놈들 컴퓨터로 뭘 도와줘야 할때만 상당히 혼란스럽단 말이지 -_-;

뭐든간에... 새로운 버전이 나와서 단축키가 바뀌면 난 그냥 새로운 단축키를 받아들인다. 이런 단축키가 안바뀌는게 최고지만 뭐 가끔씩 바뀌는걸 내가 뭐라하겠노 -_-; 그냥 새로운 표준(?)을 받아들이는게 처음에는 조금 힘들지만 먼 미래를 바라보면 훨씬 편한 방법이다.