엊그제 GITCT에서 코딩 테스트를 진행했는데,
C언어로 작성하던 프로그램에서 bool 선언 부분에 에러가 떴다.
항상 습관적으로 0과 1을 트리거로 사용했었는데,
그 날 따라 무슨일로 bool 타입을 사용했는지 모르겠다.
아무튼 이후에 구글링을 해보니,
놀랍도록 당연하게도,
C언어에는 bool 타입이 없었다..
그래서 작성해보는 C언어의 표준 이야기.
그래서 된다고 안된다고 ㅡ
두 가지 방법으로 요약할 수 있겠다.
#define 지시를 사용해서 true, false를 정의 해주는 방법이다.
후자에 비해 손가락이 좀 아프지만, 가장 직관적인 방법이라고 생각할 수 있다.
컴파일러를 타지 않는 가장 근본적인 해결책이다.
#define FALSE 0
#define TRUE 1
코드 가장 윗줄에 삽입해주기만 하면 된다.
이 방법은 C99부터 사용 가능하다.
헤더파일을 include 해주는 방법이다.
이 경우, 전자에 비해 간결하게 해결된다.
#include <stdbool.h>
이하 헤더파일을 코드에 삽입해주면 된다.
.
.
.
왜 이 코드에서 문제를 못 느꼈나 했더니, 항상 c++컴파일러를 사용했었다.
구름 뿐만 아니라, 여타 온라인 c 컴파일러들도 마찬가지였다.
c++에서는 bool타입을 기본 자료형으로 사용하고 있었고,
cpp에서 c 컴파일도 가능하기 때문에 크게 문제가 되지 않았던 거시다.
문제 없이 실행되는 모습을 볼 수 있다.
자기 이야기도 아닌데,
C언어에서 뜬금없이 String 타입을 꺼낸 격이랄까.
아니 애가 계속 딴생각 하고있으니까 ㅡㅡ
컴파일러가 화나서 온갖 열변을 내뱉었던거시다..
아까 잠깐 빼먹은 이야기가 있는데,
C99에서는 _Bool 형식으로 bool 타입을 지원한다고 한다.
그러면 왜 온라인 컴파일러들은 C99가 아닌 구 버전을 지원하는걸까??
아니 진짜로 C99를 지원하지 않는건가?
궁금해서 직접 찾아 나서기로 했다.
.
.
https://blog.naver.com/tipsware/221032917097
위 블로그에서 C언어 표준마다 차이점이 뭔지 알아봤다.
글쓴이도 c컴파일러와 C++ 컴파일러를 혼용하여 사용하고,
두 컴파일러의 차이점이 무엇인지 사람들이 모른다고 지적한다.
사실 필자 말대로 오류를 폭 넓게 허용해주고,
bool 타입과 같은 내용들이 새로 업데이트 되는 것이 더 유용한 것이 아닌가 하는 생각이 든다.
하여간, 원래 얻으려던 정보는 아래와 같다.
당장 실천해보자.
첫째로 내가 가장 유용하게 사용하는 아래 사이트다.
https://www.onlinegdb.com/online_c_compiler
근데 왜 아직까지도 베타냐
/tmp/cc8dqgzh.o: In function `main':
main.c:(.text+0x13): undefined reference to `add'
collect2: error: ld returned 1 exit status
inline 함수는 동작하지 않는 것 같다.
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 컴파일러' 임을 대놓고 광고하는 다른 컴파일러는 어떤 결과를 보여줄까?
두번째 사이트는 아래와 같다.
$gcc -std=c99 -o main *.c
$main
30
inline 함수는 올바르게 실행된다.
$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++ 컴파일러'를 써도 하나도 문제 없다ㅡ