2008. 5. 16. 19:57
C 언어에서의 bool 타입
2008. 5. 16. 19:57 in 프로그래밍/C 언어
이전글에서 C와 C++에서의 bool 타입의 동작 대해서 글을 썼습니다.
이제 C언어에서의 bool 타입의 변천사에 대해서 써볼까 합니다.
C99 이전의 C 언어에서는 bool 타입(참과 거짓을 표현하는)이 존재하지 않았습니다.
따라서 프로그래머들은 다음과 같은 방법으로 bool 타입을 사용했습니다.
그러다가 C99에서 드디어 bool 타입이 등장하게 됩니다.
그런데 여기에서 문제가 발생하게 됩니다.
bool, true, false로 구성된 bool 타입을 C99에서 추가하려고 하니까.
기존에 위와 같은 식으로 bool 타입을 만들어서 사용하던 수많은 C 코드들에서
문제가 발생하게 된 겁니다.
그래서 C99에서는 boolean 타입으로 bool을 사용하지 못하고 _Bool을 만들었습니다.
음. 그런데 _Bool 보다는 bool이 보기에도 좋고, 타자수도 적죠.
그래서 C99에서는 stdbool.h 파일을 제공하기로 했습니다.
stdbool.h 파일에는 다음과 같이 bool 이 정의되어있습니다.
그럼 결론은 다음과 같습니다.
이제 C언어에서의 bool 타입의 변천사에 대해서 써볼까 합니다.
C99 이전의 C 언어에서는 bool 타입(참과 거짓을 표현하는)이 존재하지 않았습니다.
따라서 프로그래머들은 다음과 같은 방법으로 bool 타입을 사용했습니다.
typedef int bool
#define false 0
#define true 1
bool b;
b = true;
#define false 0
#define true 1
bool b;
b = true;
그러다가 C99에서 드디어 bool 타입이 등장하게 됩니다.
그런데 여기에서 문제가 발생하게 됩니다.
bool, true, false로 구성된 bool 타입을 C99에서 추가하려고 하니까.
기존에 위와 같은 식으로 bool 타입을 만들어서 사용하던 수많은 C 코드들에서
문제가 발생하게 된 겁니다.
그래서 C99에서는 boolean 타입으로 bool을 사용하지 못하고 _Bool을 만들었습니다.
음. 그런데 _Bool 보다는 bool이 보기에도 좋고, 타자수도 적죠.
그래서 C99에서는 stdbool.h 파일을 제공하기로 했습니다.
stdbool.h 파일에는 다음과 같이 bool 이 정의되어있습니다.
typedef _Bool bool;
#define true (_Bool)1
#define false (_Bool)0
#define true (_Bool)1
#define false (_Bool)0
그럼 결론은 다음과 같습니다.
- C99에서 드디어 C 언어에서도 bool 타입을 제공한다.
- C99에서 제공하는 boolean 타입의 지시어는 bool이 아닌 _Bool이다.
- 만약 C99 표준에서 제공하는 boolean 타입을 _Bool이 아닌 bool을 사용해서 사용하고 싶다면 <stdbool.h> 파일을 include해서 사용한다.
2008. 5. 16. 19:36
C, C++ 에서의 불(bool, boolean) 타입의 동작에 대해서
2008. 5. 16. 19:36 in 프로그래밍/C 언어
C, C++에서의 bool 타입에 대해서 테스트를 해봤습니다.
테스트한 툴은 각각 다음과 같습니다.
첫번째, bool/BOOL 타입의 사이즈(sizeof)를 테스트해봤습니다.
두번째, int 타입을 bool 타입에 대입해보았습니다.
세번째, bool 타입을 정수(int)와 비교해 보았습니다.
bool 타입을 테스트한 결과는 다음과 같습니다.
gcc-2.95.3의 bool 타입과 VC6과 VS2005의 BOOL 타입은 다음과 같이 구현되어있을 것입니다.
gcc-4.1.2와 g++-4.1.2의 bool 타입과 VC6, VS2005의 bool 타입은
실제 bool 타입으로 볼 수 있습니다.
하지만 gcc의 경우에는 다음과 같은 경우에 어떤 경고도 발생시키지 않습니다.
(혹시 gcc에서 이 경우에 경고를 출력할 수 있는 옵션이 있다면 알려주시면 감사하겠습니다.^^;)
그럼 이제 bool 타입을 어떻게 사용해야할까요?
gcc-2.95.3에서는 bool 타입을 사용하지 말아야겠습니다.
제 개인적으로는 bool 타입의 의미가 더 혼란스러워지는 것 같습니다.
실제 값이 true,false가 아닌 다른 값을 가질 수도 있고,
어떤 경고도 없으니까요
VC6, VS2005에서는 BOOL이 아닌 bool을 사용해야합니다.
BOOL은 int 타입입니다. bool 타입으로 정확하게 동작하는 것은 BOOL이 아닌
bool 입니다. 따라서 BOOL이 아닌 bool 타입을 사용해야 합니다.
bool 타입을 비교하는 경우에 참과 비교하지 말고, 거짓과 비교해야 합니다.
다음의 코드를 보죠.
테스트한 툴은 각각 다음과 같습니다.
- gcc-4.1.2, g++-4.1.2, gcc-2.95.3
- VC6, VS2005
첫번째, bool/BOOL 타입의 사이즈(sizeof)를 테스트해봤습니다.
/* gcc-4.1.2, g++-4.1.2 */
#include <stdbool.h>
printf("sizeof bool : %d\n", sizeof( bool)); // 결과는 1
/* gcc-2.95.3 */
printf("sizeof bool : %d\n", sizeof( bool)); // 결과는 4
/* VC6, VS2005 */
printf("sizeof bool : %d\n", sizeof( bool)); // 결과는 1
printf("sizeof BOOL : %d\n", sizeof( BOOL)); // 결과는 4
#include <stdbool.h>
printf("sizeof bool : %d\n", sizeof( bool)); // 결과는 1
/* gcc-2.95.3 */
printf("sizeof bool : %d\n", sizeof( bool)); // 결과는 4
/* VC6, VS2005 */
printf("sizeof bool : %d\n", sizeof( bool)); // 결과는 1
printf("sizeof BOOL : %d\n", sizeof( BOOL)); // 결과는 4
두번째, int 타입을 bool 타입에 대입해보았습니다.
/* gcc-4.1.2, g++-4.1.2 */
#include <stdbool.h>
bool b;
b = 3; // b는 1의 값을 가지게 됩니다.
b = -3; // b는 1의 값을 가지게 됩니다.
/* 컴파일 옵션은 "-Wall -W"를 사용했습니다.
* int에서 bool 타입으로의 암시적 타입변환에 어떠한 경고도 출력되지 않습니다. */
/* gcc-2.95.3 */
bool b;
b = 3; // b는 3의 값을 가지게 됩니다.
b = -3; // b는 -3의 값을 가지게 됩니다.
/* VC6, VS2005 */
/* 정수값을 bool 타입에 대입할 경우에 경고가 발생하게 됩니다. */
bool b;
b = 3; // b는 1의 값을 가지게 됩니다.
BOOL B;
B = 3; // B는 3의 값을 가지게 됩니다.
#include <stdbool.h>
bool b;
b = 3; // b는 1의 값을 가지게 됩니다.
b = -3; // b는 1의 값을 가지게 됩니다.
/* 컴파일 옵션은 "-Wall -W"를 사용했습니다.
* int에서 bool 타입으로의 암시적 타입변환에 어떠한 경고도 출력되지 않습니다. */
/* gcc-2.95.3 */
bool b;
b = 3; // b는 3의 값을 가지게 됩니다.
b = -3; // b는 -3의 값을 가지게 됩니다.
/* VC6, VS2005 */
/* 정수값을 bool 타입에 대입할 경우에 경고가 발생하게 됩니다. */
bool b;
b = 3; // b는 1의 값을 가지게 됩니다.
BOOL B;
B = 3; // B는 3의 값을 가지게 됩니다.
세번째, bool 타입을 정수(int)와 비교해 보았습니다.
/* gcc-4.1.2, g++-4.1.2 */
#include <stdbool.h>
bool b;
b = 3;
/* int와 bool 타입의 비교에 대해 어떤 경고도 없습니다. */
if( b == 3) {
printf("b is 3\n");
} else {
// b에 3을 대입했지만, 결과는 b는 3과 같지 않습니다.
printf("b is not 3\n");
}
/* gcc-2.95.3 */
bool b;
b = 3;
/* int와 bool 타입의 비교에 대해 어떤 경고도 없습니다. */
if( b == 3) {
// 결과는 b는 3과 같다고 나옵니다.
printf("b is 3\n");
} else {
printf("b is not 3\n");
}
/* VC6, VS2005 */
/* int와 bool 타입의 비교에 대해 경고를 발생시킵니다. */
bool b;
b = 3;
if( b != 3) {
/* b에 3을 대입했지만, 결과는 b는 3과 같지 않습니다. */
printf("b is not 3\n");
}
BOOL B;
B = 3;
if( B == 3) {
/* B에 3을 대입하고, 그 값이 여전히 3입니다. */
printf("B is 3\n");
}
#include <stdbool.h>
bool b;
b = 3;
/* int와 bool 타입의 비교에 대해 어떤 경고도 없습니다. */
if( b == 3) {
printf("b is 3\n");
} else {
// b에 3을 대입했지만, 결과는 b는 3과 같지 않습니다.
printf("b is not 3\n");
}
/* gcc-2.95.3 */
bool b;
b = 3;
/* int와 bool 타입의 비교에 대해 어떤 경고도 없습니다. */
if( b == 3) {
// 결과는 b는 3과 같다고 나옵니다.
printf("b is 3\n");
} else {
printf("b is not 3\n");
}
/* VC6, VS2005 */
/* int와 bool 타입의 비교에 대해 경고를 발생시킵니다. */
bool b;
b = 3;
if( b != 3) {
/* b에 3을 대입했지만, 결과는 b는 3과 같지 않습니다. */
printf("b is not 3\n");
}
BOOL B;
B = 3;
if( B == 3) {
/* B에 3을 대입하고, 그 값이 여전히 3입니다. */
printf("B is 3\n");
}
bool 타입을 테스트한 결과는 다음과 같습니다.
gcc-2.95.3의 bool 타입과 VC6과 VS2005의 BOOL 타입은 다음과 같이 구현되어있을 것입니다.
typedef int bool; // gcc-2.95.3
typedef int BOOL; // VC6, VS2005
typedef int BOOL; // VC6, VS2005
gcc-4.1.2와 g++-4.1.2의 bool 타입과 VC6, VS2005의 bool 타입은
실제 bool 타입으로 볼 수 있습니다.
하지만 gcc의 경우에는 다음과 같은 경우에 어떤 경고도 발생시키지 않습니다.
- int 타입을 bool 타입에 대입
- int 타입과 bool 타입의 비교
(혹시 gcc에서 이 경우에 경고를 출력할 수 있는 옵션이 있다면 알려주시면 감사하겠습니다.^^;)
그럼 이제 bool 타입을 어떻게 사용해야할까요?
gcc-2.95.3에서는 bool 타입을 사용하지 말아야겠습니다.
제 개인적으로는 bool 타입의 의미가 더 혼란스러워지는 것 같습니다.
실제 값이 true,false가 아닌 다른 값을 가질 수도 있고,
어떤 경고도 없으니까요
VC6, VS2005에서는 BOOL이 아닌 bool을 사용해야합니다.
BOOL은 int 타입입니다. bool 타입으로 정확하게 동작하는 것은 BOOL이 아닌
bool 입니다. 따라서 BOOL이 아닌 bool 타입을 사용해야 합니다.
bool 타입을 비교하는 경우에 참과 비교하지 말고, 거짓과 비교해야 합니다.
다음의 코드를 보죠.
BOOL B;
B = 3;
if( B == TRUE) {
/* B는 TRUE가 아닙니다. B는 3의 값을 가지고, TRUE는 1의 값을 가집니다. */
}
위 코드를 다음과 같이 수정해보죠.
다음의 코드들은 모두 위와 같은 문제가 없습니다.
BOOL B;
B = 3;
if( B) {
}
if( !B) {
}
if( B != FALSE) {
}
if( B == FALSE) {
}
B = 3;
if( B == TRUE) {
/* B는 TRUE가 아닙니다. B는 3의 값을 가지고, TRUE는 1의 값을 가집니다. */
}
위 코드를 다음과 같이 수정해보죠.
다음의 코드들은 모두 위와 같은 문제가 없습니다.
BOOL B;
B = 3;
if( B) {
}
if( !B) {
}
if( B != FALSE) {
}
if( B == FALSE) {
}
2008. 5. 16. 14:33
Subversion의 svn:ignore 속성
2008. 5. 16. 14:33 in 버전관리/Subversion
Subversion의 속성중 가장 많이 사용하고 유용하게 사용하는 속성이
svn:ignore 속성이 아닐까 생각합니다.
svn:ignore 속성을 어떤때 사용하는지 예를 한번 들어보도록 하죠.
리눅스에서 C 프로그램을 작성하고 있다고 한다면 다음과 같은 파일들이 있을 겁니다.
이 중에서 실제 버전 관리되어야 할 파일은 소스파일들과 Makefile뿐입니다.
오브젝트 파일과 실행파일은 버전관리되어서는 안되겠죠.
작업사본(working copy)의 상태를 확인하기 위해서 "svn status" 명령을 실행해보죠
a.o와 a.out 파일이 위와 같이 "?"로 표시되지 않을 수도 있습니다.
(subversion 설정 파일에서 .o 파일이 자동으로 ignore 리스트에 추가되어있다면
위와 같이 a.o와 a.out 파일의 앞에 "?"로 표시되지 않을 것 입니다.)
만약 위와 같은 오브젝트 파일이 수십개가 있다고 생각해보면,
"svn status" 명령을 내릴 때마다, 버전 관리와는 상관없는 오브젝트 파일들을 계속해서 봐야만 합니다.
이럴때 사용하는 것이 svn:ignore 속성입니다.
이 속성의 의미는 여기에 등록된 파일들 및 디렉토리들은 버전관리하지 않는 것이 확실하므로
무시하라는 의미입니다.
그럼 개발환경별로 무시해야될 파일들이 어떤것들이 있는지 알아보죠.
리눅스에서 C 프로그램을 작성한다면 다음과 같은 파일들이 될 것입니다.
윈도우의 VC6 프로젝트라면 다음과 같습니다.
윈도우의 VS2005 프로젝트(VC++)라면 다음과 같습니다.
자! 그럼 이제 실제 속성들을 어떻게 설정하는지를 볼까요.
리눅스의 콘솔이라면 간단합니다.
윈도우에서 콘솔을 사용한다면, 도스 창에서 위명령을 써야겠지요.
아니면 TortoiseSVN을 사용하셔도 됩니다.
svn:ignore 속성이 아닐까 생각합니다.
svn:ignore 속성을 어떤때 사용하는지 예를 한번 들어보도록 하죠.
리눅스에서 C 프로그램을 작성하고 있다고 한다면 다음과 같은 파일들이 있을 겁니다.
- .c, .h 확장자의 소스파일들
- 빌드를 자동(?)으로 수행해줄 Makefile
- .o 확장자의 오브젝트 파일들
- 최종적으로 생성되는 .out 실행파일들
이 중에서 실제 버전 관리되어야 할 파일은 소스파일들과 Makefile뿐입니다.
오브젝트 파일과 실행파일은 버전관리되어서는 안되겠죠.
작업사본(working copy)의 상태를 확인하기 위해서 "svn status" 명령을 실행해보죠
$ svn status
M a.c
M a.h
M Makefile
? a.o
? a.out
M a.c
M a.h
M Makefile
? a.o
? a.out
a.o와 a.out 파일이 위와 같이 "?"로 표시되지 않을 수도 있습니다.
(subversion 설정 파일에서 .o 파일이 자동으로 ignore 리스트에 추가되어있다면
위와 같이 a.o와 a.out 파일의 앞에 "?"로 표시되지 않을 것 입니다.)
만약 위와 같은 오브젝트 파일이 수십개가 있다고 생각해보면,
"svn status" 명령을 내릴 때마다, 버전 관리와는 상관없는 오브젝트 파일들을 계속해서 봐야만 합니다.
이럴때 사용하는 것이 svn:ignore 속성입니다.
이 속성의 의미는 여기에 등록된 파일들 및 디렉토리들은 버전관리하지 않는 것이 확실하므로
무시하라는 의미입니다.
그럼 개발환경별로 무시해야될 파일들이 어떤것들이 있는지 알아보죠.
리눅스에서 C 프로그램을 작성한다면 다음과 같은 파일들이 될 것입니다.
- 오브젝트파일(*.o)
- 디펜던시 파일(*.d 혹은 .depend)
- 최종 실행파일
윈도우의 VC6 프로젝트라면 다음과 같습니다.
- Debug, Release 디렉토리
- *.aps, *.ncb, *.opt, *.plg, *.clw, *.positions, README.TXT
윈도우의 VS2005 프로젝트(VC++)라면 다음과 같습니다.
- Debug, Release 디렉토리
- *.ncb, *.suo, README.TXT 파일들
자! 그럼 이제 실제 속성들을 어떻게 설정하는지를 볼까요.
리눅스의 콘솔이라면 간단합니다.
$ cat ignore.list
*.o
*.d
.depend
*.out
$ svn propset -R svn:ignore -F ignore.list .
혹은 기존에 있던 svn:ignore 속성을 수정하려면
$ svn propedit svn:ignore .
*.o
*.d
.depend
*.out
$ svn propset -R svn:ignore -F ignore.list .
혹은 기존에 있던 svn:ignore 속성을 수정하려면
$ svn propedit svn:ignore .
윈도우에서 콘솔을 사용한다면, 도스 창에서 위명령을 써야겠지요.
아니면 TortoiseSVN을 사용하셔도 됩니다.
2008. 5. 5. 20:36
블로그 이미지 : TortoiseSVN의 이미지...
2008. 5. 5. 20:36 in 공지
제 블로그의 이미지는 TortoiseSVN의 이미지를 그대로 가져왔습니다.
그만큼 제가 좋아하는 프로그램이고,
개발자라면 반드시 사용해야할 프로그램이라는 생각에서 가져오게 되었습니다.
TortoiseSVN은 버전 컨트롤 시스템의 하나인 Subversion의 윈도우용 Client 입니다.
관심있으신 분들은 홈페이지를 방문해 보시기 바랍니다.
http://tortoisesvn.tigris.org
http://subversion.tigris.org
만약 본인이 개발자이고, 기존에 버전 컨트롤 시스템을 사용해 보신적이 없다면
Subversion과 TortoiseSVN은 좋은 출발점이 될 것입니다.
그만큼 제가 좋아하는 프로그램이고,
개발자라면 반드시 사용해야할 프로그램이라는 생각에서 가져오게 되었습니다.
TortoiseSVN은 버전 컨트롤 시스템의 하나인 Subversion의 윈도우용 Client 입니다.
관심있으신 분들은 홈페이지를 방문해 보시기 바랍니다.
http://tortoisesvn.tigris.org
http://subversion.tigris.org
만약 본인이 개발자이고, 기존에 버전 컨트롤 시스템을 사용해 보신적이 없다면
Subversion과 TortoiseSVN은 좋은 출발점이 될 것입니다.
2008. 5. 5. 19:09
Subversion의 속성(property)들
2008. 5. 5. 19:09 in 버전관리/Subversion
Subversion을 고급스럽게 사용하기 위해서는 속성(property)을 반드시 알아야만 합니다.
그래서 오늘은 Subversion의 속성(property)에 대해서 얘기해 볼까 합니다.
콘솔에서 다음 명령을 내려보죠..
무언가 메시지들이 출력될 것입니다.
그럼 먼저 어떤 종류의 속성(property)들이 있는지를 먼저 살펴보죠.
Subversion에서 사용되는 속성(property)은 다음과 같은 것들이 있습니다.
(물론 TortoiseSVN의 속성까지 합치면 더 많죠.)
여기서 실제 자주 사용되는 것은 다음 속성들이 아닐까 생각해봅니다.
자 그럼 이제 각 속성들이 의미하는 것이 무엇인지 살펴보도록 하죠.
그래서 오늘은 Subversion의 속성(property)에 대해서 얘기해 볼까 합니다.
콘솔에서 다음 명령을 내려보죠..
$ svn propset --help
무언가 메시지들이 출력될 것입니다.
그럼 먼저 어떤 종류의 속성(property)들이 있는지를 먼저 살펴보죠.
Subversion에서 사용되는 속성(property)은 다음과 같은 것들이 있습니다.
(물론 TortoiseSVN의 속성까지 합치면 더 많죠.)
svn:ignore
svn:kerwords
svn:executable
svn:eol-style
svn:mime-type
svn:externals
svn:need-lock
svn:kerwords
svn:executable
svn:eol-style
svn:mime-type
svn:externals
svn:need-lock
여기서 실제 자주 사용되는 것은 다음 속성들이 아닐까 생각해봅니다.
svn:ignore
svn:eol-style
svn:externals
svn:eol-style
svn:externals
자 그럼 이제 각 속성들이 의미하는 것이 무엇인지 살펴보도록 하죠.
2008. 5. 4. 09:58
한글로 표시되는 Trac 사용하기
2008. 5. 4. 09:58 in 개발 관련 툴/Trac
간단하게나마 한글로 표시되는 Trac을 설치하는 방법을 기술하려고 한다.
이 내용은 모두 Trac 프로젝트의 trunk의 최신 리비전 r6986 이상에서만 가능하다.
한글로 표시되는 Trac 설치하기
babel 설치
trac의 trunk 디렉토리 익스포트받기
다음 명령을 수행해서 po 파일들을 mo 파일로 변환하기
이제 Trac 설치
이제 다음과 같이 사용할 언어를 선택하면 한글로 표시되는 Trac을 사용할 수 있다.
Preference 선택
한국어(대한민국) 선택
한글로 바뀐 Trac ^^;
이 내용은 모두 Trac 프로젝트의 trunk의 최신 리비전 r6986 이상에서만 가능하다.
- trac-r6986에서 sandbox에서 작업중이던 i18n 코드가 trunk에 merge되었다.
한글로 표시되는 Trac 설치하기
babel 설치
trac의 trunk 디렉토리 익스포트받기
- 내 환경에서는 작업사본(익스포트가 아닌 체크아웃하면)에서 설치하면 에러가 발생했다.
# svn export https://svn.edgewall.com/repos/trac/trunk trac-trunk
# cd trac-trunk
# cd trac-trunk
다음 명령을 수행해서 po 파일들을 mo 파일로 변환하기
# python setup.py compile_catalog --use-fuzzy
이제 Trac 설치
# python setup.py install
관련 URL들
이제 다음과 같이 사용할 언어를 선택하면 한글로 표시되는 Trac을 사용할 수 있다.
Preference 선택
한글로 바뀐 Trac ^^;