[완료]C++은 C의 superset인가요?

klyx의 이미지

지금까지 그냥 애매하게 알고만(생각하고만)있던건데요...

C++을 만든 이름어려운사람(-_-;)은 C++로 C가 하는걸 100%할수 있다고 주장하는 걸로 알고 있습니다.

하지만 정설은 대부분 가능하지만 100%는 아니다 라고 알고 있구요...

그래서 C++은 C의 superset이 아니다 라고 알고 있었는데요.

그러던중 Objective-C가 C의 진정한 superset이다 라는 말을 보게되고, 문득 C++은 왜 C의 superset이 아닌가라는 궁금점이 생겼습니다.

그래서 C++ C superset등으로 검색해보니 오히려 하나같이 C++은 C의 superset이다 라고 소개되는 글들이더군요.

이걸로 더 알수 없게 되었습니다.

제가아는 C에서는 되는데 C++에서 안되는건 일부 형간변환시에 암시적으로 가능하느냐 명시적으로 해줘야하느냐같은 문제뿐입니다.

그런데 사실 암시변환은 그냥 캐스팅한번해주면되는 것이니까 이때문에 superset이 아니라고 하긴 억지같단 생각이 듭니다.

C++로는 불가능하고 C로만 가능한 무언가가 있어야 superset이 아니다라고 할수 있을것 같은데...

C++은 C의 superset인가요...? 아니라면 C만이 가능한 '무엇'은 무엇인지 알려주시면 감사하겠습니다.

doldori의 이미지

C99가 나오기 전에는 C++이 C의 supreset이라고 주장을 할 만도 했었죠.
그러나 지금은 아닙니다. 몇 가지 예를 들면

* VLA(variable length array)
* C99에 추가된 여러 초기화 문법
* 표준 라이브러리

아예 다른 언어라고 생각하는 것이 속 편합니다.

klyx의 이미지

답변감사합니다.
C99에 대해선 런타임에 배열크기가 정해질수 있다던가 구조체 초기화같은거만 알고 있었는데, 말씀듣고 C99에 추가된 사항에 대해 다시 찾아보니 엄청나군요-_-;
더불어 C++0x에 대해서도 기대됩니다...만 이제 0x도 2년밖에 안남았는데 정말 0x년도에 나올런지...

vani2의 이미지

한가지 궁금한것이 생겼는데요

VLA는 GCC의 확장기능 아닌가요?

klyx의 이미지

C99부터는 표준에 들어갔습니다.

kaeri17의 이미지

6년 전 글에 작성자분이 답을 다시 해주시다니 크크크

kaeri17의 이미지

C++을 만들때는 traditional C라고 하는 최초의 C에서 모습을 가져왔습니다. 이때는 enum이나 struct에 대한 몇가지만 제외하면(이건 이름 어려운 아저씨가 쓴 책 뒷부분에 있습니다)거의 C를 똑같이 쓸수 있었죠. 그다음에 C/C++는 각기 다른 기준에 의해 표준화가 진행되면서 많이 달라졌습니다. 그래도 표준화할때 C는 C++을, C++은 C를 염두해 두고 표준화를 진행하기 때문에 그렇게까지 많이 달라지지는 않습니다.

요즘은 꽤나 다른 모습을 가지고 있긴 하지만 VC++같은 개발툴에서 하는경우 C99같은걸 제대로 활용하지 못하고 컴파일러도 C++표준만 따르는 것도 아니고 둘다 대강 따르게 만들어 졌기 때문에 현실적으로는 그닥 다르지는 않습니다. C코드 대부분이 C++컴파일러에서 되거든요. C++구현체도 C표준을 넣기 때문에 완벽한 only C++ 컴파일러도 찾기쉽지 않습니다.

그리고 C프로그래머라고 해도 짜논 코드는 대충 Clean C안에 들어가기 때문에 완벽히 다른언어라고 볼수도 없겠죠.

그러니까 결론은, 지금은 표준상으로는 다른 언어가 되었지만, 현실적으로는 거의 superset이라고 보시면 됩니다.

klyx의 이미지

답변감사합니다.
말씀듣고 찾아보니 traditional C(아마도 classic C와 같은 것같은데, 맞나요?)에서 ANSI C와 C++이 나온거 같은 플로우차트를 보게되었습니다.
그런데 컴파일러에 대한 말씀이 나와서 찾아보니, 한 공대강의교재에서 'C++ 컴파일러는 사실상 C++ 코드를 C로 변환하는 역할만 한다.'라는 글을 보게되었는데, 이에 대해선 어떻게 생각하시나요...?
대학 강의교재에서 밑도 끝도 없는 소릴 할것 같진 않은데, 그렇다고 그대로 받아들이기엔 뭔가 위화감같은게 느껴지네요.

jick의 이미지

까마득한 옛날 초창기의 C++은 지금처럼 복잡하지 않았고 C와 큰 차이도 없었기 때문에, 초창기 C++ implementation 중에 C++을 그냥 C로 변환한 다음 C compiler를 돌리는 방식으로 구현한 경우가 있다고 들었습니다.

그러니까 그때 강의교재를 만든 다음 업데이트를 안한 모양이죠. 아니면 어디서 케케묵은 10년 된 자료로 강의교재를 만든 다음 역시 업데이트를 안했거나...

(저런 공부 안하는 교수들은 다 잘라버려야 되는데... --+)

klyx의 이미지

답변감사합니다.
상위디렉토리로 올라가보니 2000년도 강의라고 적혀있네요.
어쩌면 본인이 C++을 공부할때의 내용을 확인없이 그대로 적은걸지도 모르겠군요.
아무튼 적어도 초창기에는 그러했다는 어디에 쓸지 모를 잡지식이 하나 늘은걸로 만족해야겠네요.

jachin의 이미지

대학교재들은 수학이나, 물리 외에는 거의 몇군데씩 틀립니다.

외국서적이나 외국 강의 교재를 보세요.
====
( - -)a 이제는 학생으로 가장한 백수가 아닌 진짜 백수가 되어야겠다.

klyx의 이미지

답변감사합니다.
딱히 공부하는건 아니구요, 그냥 구글링 하나보니 저런 내용이 포함된 파워포인트파일을 보게되어서 질문해본 것이었습니다.

winner의 이미지

Programming Paradigm 입장에서 보자면 분명 C++ 는 C 의 superset 이라고 합니다.
하지만 source code 가 완전히 받아들여지지 않기 때문에 그런 측면에서는 superset 이 아니라고 하는 것입니다.

암시적 형변환도 분명 충분히 의미있게 다른 예이고, 그 외에도 이것 저것 있습니다.
특히 const 가 다릅니다.

Code 를 작성할 때 언어가 가진 능력을 최대한 살리고, 또 community 가 지지하는 문화를 받아들여 작성된 C 는
C++ 표준에 부합하지 못할 가능성이 큽니다.

암시적 형변환이 억지라고 하셨습니다만
int *a = malloc(sizeof (int));
라는 code 가 왜 C 에서 되고, C++ 에서 안 되는가에 양측의 분명한 입장차가 있습니다.

명시적 형변환을 되도록 써서는 안된다는 것이 양측 모두 동의하지만
위 경우에 있어서 C 는 암시적 형변환으로 해결해야 한다는 입장이고,
C++ 는 명시적 형변환으로 해결해야 한다고 주장합니다.

C++ 가 주장하는 명시적 형변환을 malloc 에 반드시 쓸 경우
int *a = (int *) 3;
이러한 code 가 오히려 문제없이 compile 되게 됩니다.
만일 int *a = 3; 으로 명시적 형변환을 하지 않았을 경우 compiler 가 알아서 오류를 지적해주는데 말입니다.

그래서인지 C++ 를 싫어하고 C 를 좋아하는 사람들은 C 로 project 을 진행한다고 하면
C++ 에서 compile 되지 않는 code 를 만들 가능성이 다분합니다.

사실 그 차이점을 분명히 알 정도로 C 를 좋아하는 사람들은 또한 현실을 무시하지 않겠지만 말입니다.

klyx의 이미지

답변감사합니다.

Quote:
암시적 형변환이 억지라고 하셨습니다만
int *a = malloc(sizeof (int));
라는 code 가 왜 C 에서 되고, C++ 에서 안 되는가에 양측의 분명한 입장차가 있습니다.

명시적 형변환을 되도록 써서는 안된다는 것이 양측 모두 동의하지만
위 경우에 있어서 C 는 암시적 형변환으로 해결해야 한다는 입장이고,
C++ 는 명시적 형변환으로 해결해야 한다고 주장합니다.


라고 하셨는데요, 혹시 가능하시면 C와 C++의 입장에 대한 내용을 조금 자세히 설명해주실수 있으신지요...? 아니면 관련된 문서링크라도 알려주시면 감사하겠습니다.
winner의 이미지

우선 신성국씨가 번역한 C FAQ 한글판을 읽어보시길 추천합니다.
http://www.cinsk.org/cfaqs/index-ko.html
PDF 문서에서 C++ 로 검색하면 어느정도 궁금증이 해결될 겁니다.

저 또한 C와 C++에 관련된 몇개 질문을 KLDP에 올렸었습니다만 사실 찾아보면
C FAQ 에 대부분 나와있거나 언급이 되고 있었습니다.

속시원히 답변을 얻기는 어려울지 모르지만 또한 사실 이보다 자세한 설명을
얻는 것도 쉬운 일이 아닙니다.

제 경우 제 질문에 대한 굉장히 자세한 답변을 올리신 분에게 죄송할 정도로
이해하기가 대단히 어려웠었습니다. 완전히 이해하는데 1년쯤 걸리는 것 같더군요.
제 머리가 워낙 돌이라...

C FAQ 와 유사한 C++ FAQ 역시 online 에 LITE version 이 공개되어 있지만
한글판은 없습니다.

klyx의 이미지

답변감사합니다.
이런 문서가 있는 것도 몰랐네요.
그냥 읽어봐도 재밌는 내용이 많은것 같습니다.

Quote:
Q 7.7
어떤 코드를 보면 malloc()이 리턴한 포인터를 대입할 포인터의 타입으로 캐스팅한 것을 볼 수 있는 데, 왜 그럴까요?
Answer
ANSI/ISO C 표준에서 void *를 소개되기 전에는, 대개 포인터 변환에 관계된 경고를 없애기 위해, 또는 불필요한 변환을 줄이기 위해 이러한 캐스팅을 사용했습니다.

ANSI/ISO C 표준에서는 이러한 캐스팅이 전혀 필요없습니다. 그리고 현재 이런 캐스팅을 사용하는 것은 나쁜 프로그래밍 스타일로 간주되기도 합니다. 왜냐하면 malloc()이 선언되지 않았을 때 발생할 수 있는 유용한 경고 메시지를 발생시키지 않기 때문입니다; 질문 [*]7.6을 참고하기 바랍니다. (그러나 이런 캐스팅은 여전히 자주 쓰이고 있습니다. 왜냐하면 C++에서는 이러한 캐스팅이 반드시 필요하기 때문에, 호환성을 유지하기 위해서입니다.)


이렇게 소개되어있는 내용을 찾았습니다.
이정도면 충분한 답변인것 같습니다. 어느정도 스타일의 문제도 있을테고, C와 C++의 언어적 차이도 있으니 깊이 따질 필요는 없을듯 하네요.
d3m3vilurr의 이미지

사실 void*에 대한 명시적 캐스트는 스타일의 문제가 아닙니다.
C/C++을 혼용하는 프로젝트에서는 컨벤션이나 코드 호환성을 맞추기 위해 cast를 사용해야 하지만,
C만 쓰는 프로젝트에서는 후에 생길 수도 있는 형변환의 문제를 방지하기 위해서라도 cast를 별도로 하는것이 안좋습니다.
그 엄격한 C++에서 조차도 static_cast나 dynamic_cast 와 같은 연산을 지원하며, 꼭 필요한 경우가 아니라면 static_cast를 사용하지 않기를 권고합니다.

컴파일러가 표시하는 warning 메시지는 그저 경고일 뿐이지 심각하게 이건 없어져야 해 라는건 아닐 수도 있는 거지요.

그리고 사실 C++이 C의 슈퍼셋이냐 아니냐는 C코드를 C++컴파일러가 해석하지 못하는 경우가 있다는 것만으로도, 슈퍼셋이라 생각하기 어렵습니다.

klyx의 이미지

답변감사합니다.
사실 처음엔 superset이냐 아니냐로 시작했지만, 이젠 그런건 아무래도 좋게 되버렸네요-_-;;
말씀하신대로 superset이냐 아니냐만 따지자면 그래로 통과가 안되므로 superset이 아니라고 하는게 맞는거 같습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.