c에서 bool을 선언해서 사용할 수 있습니까?
글쓴이: indizarm / 작성시간: 수, 2003/09/03 - 11:28오전
c를 사용하지 않다가, 정확히 말하면 c++ 컴파일러 덕분에
c++ 의 data type과 변수 선언을 이용, c형식의 hybrid
프로그램을 짜는 습관 때문에, 얼마전에 작성한 code에 조
금 문제가 생겼습니다.
bool을 type으로 사용했거든요. -_-;;;
뒤늦게 발견하고서 전체적으로 뒤집기 보다는 c인 경우에는
bool을 type으로 선언하려고 시도했습니다.
시도 中 한 가지: #if !defined(__cplusplus) #ifdef __linux__ #undef bool #endif enum bool { true = 1, TRUE = 1, false = 0, FALSE = 0 }; #endif 에러 메세지: argc_test.c:21: `bool' undeclared (first use in this function) argc_test.c:21: (Each undeclared identifier is reported only once argc_test.c:21: for each function it appears in.)
문제는 __cplusplus라는 macro가 ms specific 이라는 점입니다.
리눅스 gcc에서는 전혀 안먹고 (예상은 했지만 왠지 당황스러운...)
그 결과 file type(gcc에서는 확장자로 구분하는 듯...)에 따라서 완
전히 다르게 작동하더군요.
*.c에서는 #undef bool이 전혀 의미 없는 동작이었고 *.cpp에서는
멀쩡한 type인 bool을 없애주더군요. (그리고 *.cpp에서
제가 원한 것은 'c에서는 true,TRUE,false,FALSE를 가지는 type인
bool이고 c++에서는 기존의 bool을 해제하고 앞에서 말한 type을
선언' 하는 것이었는데, 전혀 다르게 동작하더군요.
질문 1. 제가 새로 bool을 type으로 선언해서 사용할 수 있습니까?
질문 2. 코드 내에서 c와 c++을 구분할 수 있는 macro나 방법이 있습니까?
Forums:
Re: c에서 bool을 선언해서 사용할 수 있습니까?
__cplusplus는 C++ 표준입니다. 리눅스에서도 g++로 컴파일하면 이 마크로가 정의됩니다. gcc는 C 컴파일러지, C++ 컴파일러가 아닙니다.
Visual C도 확장자가 .c일 경우엔 C 컴파일러로, 확장자가 .cpp일 경우엔 C++ 컴파일러로 동작"해야 "합니다. (아닌가요?) 많은 Visual C 사용자들은 C 프로그램과 C++ 프로그램의 중간쯤 되는 언어(C#인가? :roll: )로 코딩하는 습관이 있더군요.
네. 하지만 C99 표준에는 이미 bool 형이 정의되어 있습니다. gcc에서는
#include <stdbool.h>
로 끝입니다. 구체적인 구현은 이 헤더파일을 들여다보시고요. (/usr/lib/gcc-lib/... 에 들어 있습니다.)
__cplusplus 마크로.
[code:1]#ifndef __cplusplus#ifdef
_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz
답변 감사합니다.
그냥
#ifdef __linux__
#include<stdbool.h>
#endif
했습니다.
그런데 gcc는 gnu compiler collection아닌가요?
단순히 c만 compile하는 것이 아닌 것 같던데...
compiler에서 predefined macro를 알 수 있는 방법이
있습니까?
What a Cool Days!!!
enum 선언에 문제가 있네요.
C99 에서의 사용은 cdpark 님이 말씀하신데로이고요.
enum 과 struct 는 C 에서는 C++ 와 달리 type 을 만들지 않습니다.
따라서 typedef 을 써주어야 합니다.
즉 다음과 같습니다.
저도 C++ 하다가 C 를 하려니까 헷갈리네요.
Re: 답변 감사합니다.
더 정확히는..
gcc는 .c 파일은 C 프로그램으로 컴파일하고, .cpp 파일은 C++ 프로그램으로 컴파일합니다. 그리고 C 라이브러리를 링크하죠. 따라서 정상적인 C++ 프로그램은 옵션없이 gcc로 컴파일하는게 불가능합니다. g++은 이 gcc를 적당한 옵션(!)을 줘서 C++ 라이브러리를 붙이도록 불러주고요.
그냥 gcc는 C 컴파일러, g++은 C++ 컴파일러라고 생각하시는게 속편합니다.
purewell님 감사합니다.
이 방법도 되겠군요. c와 c++을 섞어서 쓰는 바람에
지금 피보고 있습니다. -_-;;;
What a Cool Days!!!
으아악!!
cdpark님 말씀대로군요. 지금 VC++에서 파일 황장자를 *.c로
하고 작업한 파일을 다시 컴파일 해봤더니 수많은 에러를 쏟아내고
있습니다. 제기랄.
c하고 c++섞어서 쓰는 -_-;; 버릇때문에 지금 환장하겠습니다.
처음부터 다시 살펴봐야할 듯...
c++ 처음 배울때 bool type있는거랑, 아무데서나 변수 선언할
수 있는 것을 보고 아주 좋아했는데, 그때는 c로 하던 습관이 c++
습관을 묘하게 변형시키더니, 그때 생긴 그 지저분한 '습관' 때문에
오늘 이런 멋진 일을 당하는군요.
주석도 다시 고쳐야되고... // => /* */ -_-;;
지금 VC++ 에서 우선 전체적으로 한 번 손보고, telnet창 두개 띄워서
한쪽에서는 gcc로 컴파일만, 한쪽에서는 vi로 손보고 있습니다.
좋은 방법이 안떠올라서... 답변 감사합니다.
What a Cool Days!!!
근데 왜 gcc 로 컴파일 할려고 하시는거죠? 저라면 그냥 g++ 로
근데 왜 gcc 로 컴파일 할려고 하시는거죠?
저라면 그냥 g++ 로 컴파일 할 것 같은데요.
c++ 보다 c 가 갖는 장점이 뭔가요?
클래스를 사용하지 않는 c++ 코딩하고 c 코딩 사이에도 포퍼먼스 차이가 나나요?
gcc를 쓰는 이유는...
gcc를 쓰는 이유는... 제가 알바라서 그렇습니다. -_-;;;
농담이고요. 지금 작업하는 환경이 그렇게 되었습니다.
뭐 자세한 내용은 말씀드리기 그렇고....
그런데 이런 경우에 왜 이런 에러가 뜨는지 궁금합니다.
c에서는 구조체 내부에 구조체 선언이 안됩니까? -_-;;;
What a Cool Days!!!
Re: c에서 bool을 선언해서 사용할 수 있습니까?
c와 c++의 중간쯤되는 언어? -_-;; 아마 c± 가 아닐지... 농담임다. :?
What a Cool Days!!!
Re: gcc를 쓰는 이유는...
중첩된 struct는 허용합니다. 단지 C++에서는 struct typename {...} 이지만, C언어에선 struct tagname {...} 입니다. 나중에 typedef struct tagname typename 식으로 재선언해준다면 모를까요.
댓글 달기