C언어에서 bool 타입을 쓸 수 있다?

테리쟝·2021년 7월 12일
0

한모금.

목록 보기
2/2

시작은.

엊그제 GITCT에서 코딩 테스트를 진행했는데,
C언어로 작성하던 프로그램에서 bool 선언 부분에 에러가 떴다.

항상 습관적으로 0과 1을 트리거로 사용했었는데,
그 날 따라 무슨일로 bool 타입을 사용했는지 모르겠다.

아무튼 이후에 구글링을 해보니,
놀랍도록 당연하게도,

C언어에는 bool 타입이 없었다..
그래서 작성해보는 C언어의 표준 이야기.

결론.

그래서 된다고 안된다고 ㅡ

두 가지 방법으로 요약할 수 있겠다.

1. 직접 정의해주는 방법

#define 지시를 사용해서 true, false를 정의 해주는 방법이다.
후자에 비해 손가락이 좀 아프지만, 가장 직관적인 방법이라고 생각할 수 있다.
컴파일러를 타지 않는 가장 근본적인 해결책이다.

#define FALSE 0
#define TRUE 1

코드 가장 윗줄에 삽입해주기만 하면 된다.

2. 헤더 파일을 포함해주는 방법

이 방법은 C99부터 사용 가능하다.

헤더파일을 include 해주는 방법이다.
이 경우, 전자에 비해 간결하게 해결된다.

#include <stdbool.h>

이하 헤더파일을 코드에 삽입해주면 된다.

.
.
.

여담.

왜 이 코드에서 문제를 못 느꼈나 했더니, 항상 c++컴파일러를 사용했었다.
구름 뿐만 아니라, 여타 온라인 c 컴파일러들도 마찬가지였다.

c++에서는 bool타입을 기본 자료형으로 사용하고 있었고,
cpp에서 c 컴파일도 가능하기 때문에 크게 문제가 되지 않았던 거시다.

문제 없이 실행되는 모습을 볼 수 있다.

자기 이야기도 아닌데,
C언어에서 뜬금없이 String 타입을 꺼낸 격이랄까.
아니 애가 계속 딴생각 하고있으니까 ㅡㅡ
컴파일러가 화나서 온갖 열변을 내뱉었던거시다..

아까 잠깐 빼먹은 이야기가 있는데,
C99에서는 _Bool 형식으로 bool 타입을 지원한다고 한다.

그러면 왜 온라인 컴파일러들은 C99가 아닌 구 버전을 지원하는걸까??
아니 진짜로 C99를 지원하지 않는건가?

궁금해서 직접 찾아 나서기로 했다.

.
.

온라인 컴파일러는 C99를 지원하는가.

https://blog.naver.com/tipsware/221032917097
위 블로그에서 C언어 표준마다 차이점이 뭔지 알아봤다.

글쓴이도 c컴파일러와 C++ 컴파일러를 혼용하여 사용하고,
두 컴파일러의 차이점이 무엇인지 사람들이 모른다고 지적한다.

사실 필자 말대로 오류를 폭 넓게 허용해주고,
bool 타입과 같은 내용들이 새로 업데이트 되는 것이 더 유용한 것이 아닌가 하는 생각이 든다.

하여간, 원래 얻으려던 정보는 아래와 같다.

1. C99 에서 inline 함수를 도입

2. 우리가 찾아나서던 bool 타입 사용

당장 실천해보자.
첫째로 내가 가장 유용하게 사용하는 아래 사이트다.

https://www.onlinegdb.com/online_c_compiler
근데 왜 아직까지도 베타냐

1. inline

/tmp/cc8dqgzh.o: In function `main':
main.c:(.text+0x13): undefined reference to `add'
collect2: error: ld returned 1 exit status

inline 함수는 동작하지 않는 것 같다.
bool 타입은 어떨까?

2. bool

main.c:6:5: error: unknown type name ‘bool’
     bool ask = true;
     ^~~~
main.c:6:16: error: ‘true’ undeclared (first use in this function)
     bool ask = true;
                ^~~~
main.c:6:16: note: each undeclared identifier is reported only once
for each function it appears in

역시 동작하지 않는다.
이 사이트는 C90을 표준하는 것 같다.
사실 사이트에서 같이 제공하는 'C++컴파일러'를 사용한다면, 크게 상관 없는 부분이다.

.
.

그렇다면, 'C99 컴파일러' 임을 대놓고 광고하는 다른 컴파일러는 어떤 결과를 보여줄까?
두번째 사이트는 아래와 같다.

https://www.tutorialspoint.com/compile_c99_online.php

1. inline

$gcc -std=c99 -o main *.c
$main
30

inline 함수는 올바르게 실행된다.

2. bool

$gcc -std=c99 -o main *.c
main.c: In function ‘main’:
main.c:6:5: error: unknown type name ‘bool’; did you mean ‘_Bool’?
     bool ask = true;
     ^~~~
     _Bool
main.c:6:16: error: ‘true’ undeclared (first use in this function)
     bool ask = true;
                ^~~~
main.c:6:16: note: each undeclared identifier is reported only once
for each function it appears in

bool 타입은 조금 다른 결과를 보여준다.
헤더파일을 include 한 것과는 다르게, _Bool형을 추쳔해준다.
아까 본 블로그에서와 같은 결과를 가져다 주는 것 같다.

모두 확인해 보지는 못했지만,
많은 컴파일러들이 C90형식을 사용하는 것 같다.

그래서 결론이 뭐냐고 ㅡㅡ

마무리는 이렇게 지어야 할 것 같다.

마무리.

꽤 빙글빙글 돌아서 여기까지 도착했다.
그래서 C 컴파일과 C++ 컴파일의 차이는 무엇이느냐.

http://scieng.net/tech/11190
위 링크에서 가장 잘 설명해주고 있는 것 같다.
그중에서 첫 번째 댓글.

C++ 컴파일러에서 고전적인 C를 구현해도 아무런 문제가 되지 않습니다. 확장버젼이라고 보시면 되겠죠

흠, 뭔가 부족하달까.
옆동네 나무위키 C++ 항목에선 이렇게 쓰여 있었다.

다만, C가 항상 C++의 부분집합이었던 것은 아니라서 공통적인 부분에서 몇몇 차이점이 있으며, 순수 C 소스 코드를 C++로 컴파일 할 때 문제의 여지가 생길 가능성이 있다.

전에 유니티를 사용할 때에도 버전때문에 골치를 앓았었는데,
표준에 관한 내용들은 항상 중요하게 생각해야 하는 것 같다.

영문 자료나 전문적인 내용을 많이 찾지도 못하고,
첫 글이 예쁘게 작성되었는지 걱정되어서 여러모로 안타깝지만.
오랜만에 뿌듯한 하루를 보낸 것 같아서 마음만은 엄청 기쁘다.

아직 중요한 결론이 안나왔지만 말인데..
그냥 한마디로 말하자면, 당장은 이렇게 생각하면 될 것같다.

그냥 'C++ 컴파일러'를 써도 하나도 문제 없다ㅡ

profile
큐트큐트 테리쟝이애오

0개의 댓글