VC++에서 기본 char 타입을 unsigned로 만들기

@codemaru · September 05, 2007 · 6 min read

언어탭의 기본 문자 부호 없음 속성이 있더군요. 부호 없음이란 말에 익숙치가 않아서 못찾았나 봅니다. 잘못된 정보였네요. 여기서 예를 하면 /J 옵션이 자동으로 추가됩니다. 굳이 수동으로 추가하실 필요 없습니다.

VC        char     unsigned      md 0


디스어셈블러를 만들 일이 있어서 ollydbg 홈페이지를 기웃거리다 디스어셈블러 소스를 받았습니다. ollydbg는 너무나도 유명한 디버거죠. 유저모드 디버거론 가장 인기 있는게 아닐까란 생각이 들 정도입니다. 하여튼. 그래서 디스어셈블러 소스를 받아서 컴파일 했습니다. 두 가지 부분에서 걸리더군요.

하나는 전처리기 였습니다. 아래 소스 부분입니다.

#if (char) 0xff != 255  
#error Please set default char type to unsigned  
#endif
```지금까지의 제 상식으로는 사실 잘 납득이 가지 않는 구문이었습니다. 전처리기란 말 그대로 컴파일러가 처리하기 전에 처리하는 단계죠. 그 단계에 char로 캐스팅을 하는 것도 웃기고 컴파일러 옵션을 전처리기가 알아먹는다는 것은 더욱 이상한 일이자나요. 하여튼 과감하게 주석처리 해버렸습니다.  
  
그러자 곳곳에서 unsigned char가 아니라고 중얼되는 에러들이 발생하더군요. 그래서 프로젝트 옵션을 열었습니다. 왠걸 charunsigned로 만드는 옵션이 보이지 않더군요. 볼랜드 계열의 컴파일러는 대부분 이 옵션을 가지고 있습니다. 클릭해서 선택할 수 있게 말이죠. 하여튼 GUI에 나타난게 없어서 수동으로 추가해주고 컴파일을 시켰습니다. 찾아보니 /J 옵션이 해당 기능을 수행한다고 하더군요. 자세한 정보는 아래 페이지를 참고 하세요.  
[http://msdn2.microsoft.com/en-us/library/0d294k5z(VS.80).aspx](http://msdn2.microsoft.com/en-us/library/0d294k5z%28VS.80%29.aspx)  
  
간단하게 이 옵션의 기능을 부연 설명하면 다음과 같습니다.  
일반적인 경우에는 아래와 같이 컴파일이 됩니다.  
char == signed char  
unsigned char == unsigned char  
  
그런데 /J 옵션을 적용하면 아래와 같이 바뀝니다.  
char == unsigned char  
signed char == signed char  
  
----  
몇 일 전에 작성하다 말아서 그런지 두 번째 문제가 뭐였는지 까먹었습니다. ㅠㅠ  
하여튼 컴파일해서 돌려보니 디스어셈블러는 훌륭하게 동작하더군요.  
전 사실 컨벤션이나 인덴트, 네이밍을 그다시 중요하게 생각하지 않습니다.  
툴도 좋아졌고, 개념있는 개발자라면 누구나 쉽게 알 수 있게, 이해할 수 있게 작성한다고 믿기 때문이죠.  
그런데 디스어셈블러 소스는 조금 보기 힘들었습니다. ㅎㅎ   
굳이 수정을 할 부분은 없기 때문에 딱히 분석할 필요도 없었지만 말입니다.  
olly 만든 아저씨가 굉장히 옛날 스타일을 좋아하시나 봅니다.  
  
앞 서 언급했던 전처리기 문제가 생각나서 좀 더 찾아봤습니다.  
VC++에서는 사용할 수 없는 문법입니다.  
설명은 아래 페이지에 나와있습니다.  
[http://msdn2.microsoft.com/en-us/library/ew2hz0yd(VS.71).aspx](http://msdn2.microsoft.com/en-us/library/ew2hz0yd%28VS.71%29.aspx)  
간단하게 요점만 설명하면 #if 구문에 쓸 수 있는 표현식은 상수식인데 제약 사항이 있습니다.  
그 제약 사항 중에 하나가 sizeof나 타입 캐스팅을 할 수 없다는 겁니다.  
참고로 cygwin에서 gcc로 컴파일해도 에러가 나더군요.  
  
좀 더 들어가서 그렇다면 과연 전처리기를 통해서 char의 기본 타입이 unsigned인지 체크할 방법이 없을까? 란 문제에 대해서 잠시 고민해 보았습니다. 고민해 보았는데 딱히 답은 보이지 않더군요. #if에 사용할 수 있는 표현식이 매우 제한적이고 처리되는 타입의 기본 단위가 정수이기 때문에 방법을 찾기가 쉽지 않았습니다. 좋은 아이디어 있으신 분은 알려주세요. \*^^\*  
  
앞에서 우리가 본 것은 사실 함정입니다.  
전처리기에서 처리하려면 꼭 뭔가 산술적인 조건이나 캐스팅을 해야하는 것처럼 보여주는 것이죠.  
간단한 방법으로 아래와 같이 처리할 수 있습니다.  
이 방법은 VC++과 gcc 모두에서 안전하게 컴파일 됩니다.  
```cpp
#include <limits.h>  
#if CHAR\_MAX != UCHAR\_MAX  
#error Please set default char type to unsigned  
#endif
@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중