c에서 bool을 선언해서 사용할 수 있습니까?

indizarm의 이미지

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나 방법이 있습니까?

cdpark의 이미지

Quote:
문제는 __cplusplus라는 macro가 ms specific 이라는 점입니다.
리눅스 gcc에서는 전혀 안먹고 (예상은 했지만 왠지 당황스러운...)
그 결과 file type(gcc에서는 확장자로 구분하는 듯...)에 따라서 완
전히 다르게 작동하더군요.

__cplusplus는 C++ 표준입니다. 리눅스에서도 g++로 컴파일하면 이 마크로가 정의됩니다. gcc는 C 컴파일러지, C++ 컴파일러가 아닙니다.

Visual C도 확장자가 .c일 경우엔 C 컴파일러로, 확장자가 .cpp일 경우엔 C++ 컴파일러로 동작"해야 "합니다. (아닌가요?) 많은 Visual C 사용자들은 C 프로그램과 C++ 프로그램의 중간쯤 되는 언어(C#인가? :roll: )로 코딩하는 습관이 있더군요.

Quote:
질문 1. 제가 새로 bool을 type으로 선언해서 사용할 수 있습니까?

네. 하지만 C99 표준에는 이미 bool 형이 정의되어 있습니다. gcc에서는
#include <stdbool.h>
로 끝입니다. 구체적인 구현은 이 헤더파일을 들여다보시고요. (/usr/lib/gcc-lib/... 에 들어 있습니다.)

Quote:
질문 2. 코드 내에서 c와 c++을 구분할 수 있는 macro나 방법이 있습니까?

__cplusplus 마크로.

purewell의 이미지

#ifndef __cplusplus

#ifdef bool
#undef bool
#endif

typedef unsigned char bool;

#define false 0
#define true (!false)

#endif

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

indizarm의 이미지

그냥

#ifdef __linux__
#include<stdbool.h>
#endif

했습니다.

그런데 gcc는 gnu compiler collection아닌가요?
단순히 c만 compile하는 것이 아닌 것 같던데...

compiler에서 predefined macro를 알 수 있는 방법이
있습니까?

What a Cool Days!!!

winner의 이미지

C99 에서의 사용은 cdpark 님이 말씀하신데로이고요.

enum 과 struct 는 C 에서는 C++ 와 달리 type 을 만들지 않습니다.
따라서 typedef 을 써주어야 합니다.

즉 다음과 같습니다.

typedef enum {
    true = 1, 
    TRUE = 1, 
    false = 0, 
    FALSE = 0 
} bool;

저도 C++ 하다가 C 를 하려니까 헷갈리네요.

cdpark의 이미지

indizarm wrote:
그런데 gcc는 gnu compiler collection아닌가요?
단순히 c만 compile하는 것이 아닌 것 같던데...

더 정확히는..

gcc는 .c 파일은 C 프로그램으로 컴파일하고, .cpp 파일은 C++ 프로그램으로 컴파일합니다. 그리고 C 라이브러리를 링크하죠. 따라서 정상적인 C++ 프로그램은 옵션없이 gcc로 컴파일하는게 불가능합니다. g++은 이 gcc를 적당한 옵션(!)을 줘서 C++ 라이브러리를 붙이도록 불러주고요.

그냥 gcc는 C 컴파일러, g++은 C++ 컴파일러라고 생각하시는게 속편합니다.

indizarm의 이미지

이 방법도 되겠군요. c와 c++을 섞어서 쓰는 바람에
지금 피보고 있습니다. -_-;;;

#ifndef __cplusplus 

#ifdef bool 
#undef bool 
#endif 

typedef unsigned char bool; 

#define false 0 
#define true (!false) 

#endif 
 

What a Cool Days!!!

indizarm의 이미지

cdpark님 말씀대로군요. 지금 VC++에서 파일 황장자를 *.c로
하고 작업한 파일을 다시 컴파일 해봤더니 수많은 에러를 쏟아내고
있습니다. 제기랄.

c하고 c++섞어서 쓰는 -_-;; 버릇때문에 지금 환장하겠습니다.
처음부터 다시 살펴봐야할 듯...

c++ 처음 배울때 bool type있는거랑, 아무데서나 변수 선언할
수 있는 것을 보고 아주 좋아했는데, 그때는 c로 하던 습관이 c++
습관을 묘하게 변형시키더니, 그때 생긴 그 지저분한 '습관' 때문에
오늘 이런 멋진 일을 당하는군요.

주석도 다시 고쳐야되고... // => /* */ -_-;;

지금 VC++ 에서 우선 전체적으로 한 번 손보고, telnet창 두개 띄워서
한쪽에서는 gcc로 컴파일만, 한쪽에서는 vi로 손보고 있습니다.

좋은 방법이 안떠올라서... 답변 감사합니다.

What a Cool Days!!!

ssehoony의 이미지

근데 왜 gcc 로 컴파일 할려고 하시는거죠?
저라면 그냥 g++ 로 컴파일 할 것 같은데요.

c++ 보다 c 가 갖는 장점이 뭔가요?
클래스를 사용하지 않는 c++ 코딩하고 c 코딩 사이에도 포퍼먼스 차이가 나나요?

indizarm의 이미지

gcc를 쓰는 이유는... 제가 알바라서 그렇습니다. -_-;;;

농담이고요. 지금 작업하는 환경이 그렇게 되었습니다.
뭐 자세한 내용은 말씀드리기 그렇고....

그런데 이런 경우에 왜 이런 에러가 뜨는지 궁금합니다.

c에서는 구조체 내부에 구조체 선언이 안됩니까? -_-;;;

struct outer_elem;
typedef struct outer_elem* outer;
struct outer_elem
{
        int i;
        char ch;

        struct nested
        {
                int n_i;
                char n_ch;
        };

        nested nested_inst;
        outer next_outer;
};

int main()
{
        outer outer_inst;

        printf("정상적으로 동작하고 있음\n");

        return 0;
}

에러 메세지: 

struct_test.c:17: parse error before "nested"
struct_test.c:17: warning: no semicolon at end of struct or union
struct_test.c:19: parse error before '}' token

What a Cool Days!!!

indizarm의 이미지

cdpark wrote:

많은 Visual C 사용자들은 C 프로그램과 C++ 프로그램의 중간쯤 되는 언어(C#인가? :roll: )로 코딩하는 습관이 있더군요.

c와 c++의 중간쯤되는 언어? -_-;; 아마 c± 가 아닐지... 농담임다. :?

What a Cool Days!!!

cdpark의 이미지

indizarm wrote:
그런데 이런 경우에 왜 이런 에러가 뜨는지 궁금합니다.

c에서는 구조체 내부에 구조체 선언이 안됩니까? -_-;;;

struct outer_elem;
typedef struct outer_elem* outer;
struct outer_elem
{
        int i;
        char ch;

        struct nested
        {
                int n_i;
                char n_ch;
        };

        nested nested_inst;
        outer next_outer;
};

중첩된 struct는 허용합니다. 단지 C++에서는 struct typename {...} 이지만, C언어에선 struct tagname {...} 입니다. 나중에 typedef struct tagname typename 식으로 재선언해준다면 모를까요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.