오늘 커밋 로그를 보다가 멋진 트릭을 하나 발견!
C의 #if에서 정의 됐을지 안 됐을지 모르는 상수를 계산식에 써버리면 치명적인 에러가 보통 발생합니다. 예를 들면
1 2 3 |
#if NUM_OF_GIRLFRIENDS > 1 #error you're denied to run this program. #endif |
이 코드를 컴파일할 때 미리 NUM_OF_GIRLFRIENDS 가 아예 정의되어 있지 않다면, (아마도 전혀 기억이 없는 사람.. ~먼산~)
1 2 3 |
#if > 1 #error you're denied to run this program. #endif |
이렇게 돼서 > 연산자의 왼쪽이 없어서 에러가 나는데, 보통 사람의 해결방법은 #ifdef를 위에 쓰는 것이겠지만.. 오늘 파이썬 커밋 로그에서 모 플랫폼 (사실은 FreeBSD 4 -.-;)에서 _POSIX_SEMAPHORES 가 정의되지 않아서 생기는 문제점을 Martin이 고친 것을 봤는데 이렇게 고쳐놨습니다.
1 2 3 4 |
#if (_POSIX_SEMAPHORES+0) == -1 #define HAVE_BROKEN_POSIX_SEMAPHORES ... #endif |
_POSIX_SEMAPHORES가 정의되어 있지 않더라도 +0 == -1이 돼서.. 결국은 제대로 전처리가 되는 것!! +_+
wikiX에서 정규표현식에 e modifier로 php 코드 집어 넣을 때 흔히 쓰던 방법이군요. -.-
죽이는군요… 저는 저런발상은 처음 생각해봤다눙.. 역시 토끼군은 천재…@.@
#if NUM_OF_GIRLFRIENDS > 1
…… -.-;;
onion: BLAHBLAH+0 꼴의 코드는 제가 쓴 게 아니라 조 희대 님(wikiX 메인 개발자)께서 쓰신 거라서… =3=33
>= 1 로 해주시지.. ㅡ.-)