[완료]C++은 C의 superset인가요?
글쓴이: klara / 작성시간: 목, 2008/02/28 - 4:41오후
지금까지 그냥 애매하게 알고만(생각하고만)있던건데요...
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만이 가능한 '무엇'은 무엇인지 알려주시면 감사하겠습니다.
Forums:
C99가 나오기 전에는
C99가 나오기 전에는 C++이 C의 supreset이라고 주장을 할 만도 했었죠.
그러나 지금은 아닙니다. 몇 가지 예를 들면
* VLA(variable length array)
* C99에 추가된 여러 초기화 문법
* 표준 라이브러리
아예 다른 언어라고 생각하는 것이 속 편합니다.
답변감사합니다. C99에
답변감사합니다.
C99에 대해선 런타임에 배열크기가 정해질수 있다던가 구조체 초기화같은거만 알고 있었는데, 말씀듣고 C99에 추가된 사항에 대해 다시 찾아보니 엄청나군요-_-;
더불어 C++0x에 대해서도 기대됩니다...만 이제 0x도 2년밖에 안남았는데 정말 0x년도에 나올런지...
한가지 중금한것이 생겼는데요VLA는 GCC의
한가지 궁금한것이 생겼는데요
VLA는 GCC의 확장기능 아닌가요?
C99부터는 표준에 들어갔습니다.
C99부터는 표준에 들어갔습니다.
6년 전 글에 작성자분이 답을 다시 해주시다니 크크크
6년 전 글에 작성자분이 답을 다시 해주시다니 크크크
C++을 만들때는
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이라고 보시면 됩니다.
답변감사합니다. 말씀
답변감사합니다.
말씀듣고 찾아보니 traditional C(아마도 classic C와 같은 것같은데, 맞나요?)에서 ANSI C와 C++이 나온거 같은 플로우차트를 보게되었습니다.
그런데 컴파일러에 대한 말씀이 나와서 찾아보니, 한 공대강의교재에서 'C++ 컴파일러는 사실상 C++ 코드를 C로 변환하는 역할만 한다.'라는 글을 보게되었는데, 이에 대해선 어떻게 생각하시나요...?
대학 강의교재에서 밑도 끝도 없는 소릴 할것 같진 않은데, 그렇다고 그대로 받아들이기엔 뭔가 위화감같은게 느껴지네요.
까마득한 옛날
까마득한 옛날 초창기의 C++은 지금처럼 복잡하지 않았고 C와 큰 차이도 없었기 때문에, 초창기 C++ implementation 중에 C++을 그냥 C로 변환한 다음 C compiler를 돌리는 방식으로 구현한 경우가 있다고 들었습니다.
그러니까 그때 강의교재를 만든 다음 업데이트를 안한 모양이죠. 아니면 어디서 케케묵은 10년 된 자료로 강의교재를 만든 다음 역시 업데이트를 안했거나...
(저런 공부 안하는 교수들은 다 잘라버려야 되는데... --+)
답변감사합니다. 상위
답변감사합니다.
상위디렉토리로 올라가보니 2000년도 강의라고 적혀있네요.
어쩌면 본인이 C++을 공부할때의 내용을 확인없이 그대로 적은걸지도 모르겠군요.
아무튼 적어도 초창기에는 그러했다는 어디에 쓸지 모를 잡지식이 하나 늘은걸로 만족해야겠네요.
강의교재가 틀린 경우도 많습니다...
대학교재들은 수학이나, 물리 외에는 거의 몇군데씩 틀립니다.
외국서적이나 외국 강의 교재를 보세요.
====
( - -)a 이제는 학생으로 가장한 백수가 아닌 진짜 백수가 되어야겠다.
답변감사합니다. 딱히
답변감사합니다.
딱히 공부하는건 아니구요, 그냥 구글링 하나보니 저런 내용이 포함된 파워포인트파일을 보게되어서 질문해본 것이었습니다.
C 만이 가능하다는 것을 어떻게 정의하냐에 따라 다르겠죠.
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 를 좋아하는 사람들은 또한 현실을 무시하지 않겠지만 말입니다.
답변감사합니다. 인용
답변감사합니다.
라고 하셨는데요, 혹시 가능하시면 C와 C++의 입장에 대한 내용을 조금 자세히 설명해주실수 있으신지요...? 아니면 관련된 문서링크라도 알려주시면 감사하겠습니다.
솔직히 잘 설명할 자신이 없네요.
우선 신성국씨가 번역한 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 이 공개되어 있지만
한글판은 없습니다.
답변감사합니다. 이런
답변감사합니다.
이런 문서가 있는 것도 몰랐네요.
그냥 읽어봐도 재밌는 내용이 많은것 같습니다.
이렇게 소개되어있는 내용을 찾았습니다.
이정도면 충분한 답변인것 같습니다. 어느정도 스타일의 문제도 있을테고, C와 C++의 언어적 차이도 있으니 깊이 따질 필요는 없을듯 하네요.
사실 void*에 대한
사실 void*에 대한 명시적 캐스트는 스타일의 문제가 아닙니다.
C/C++을 혼용하는 프로젝트에서는 컨벤션이나 코드 호환성을 맞추기 위해 cast를 사용해야 하지만,
C만 쓰는 프로젝트에서는 후에 생길 수도 있는 형변환의 문제를 방지하기 위해서라도 cast를 별도로 하는것이 안좋습니다.
그 엄격한 C++에서 조차도 static_cast나 dynamic_cast 와 같은 연산을 지원하며, 꼭 필요한 경우가 아니라면 static_cast를 사용하지 않기를 권고합니다.
컴파일러가 표시하는 warning 메시지는 그저 경고일 뿐이지 심각하게 이건 없어져야 해 라는건 아닐 수도 있는 거지요.
그리고 사실 C++이 C의 슈퍼셋이냐 아니냐는 C코드를 C++컴파일러가 해석하지 못하는 경우가 있다는 것만으로도, 슈퍼셋이라 생각하기 어렵습니다.
답변감사합니다. 사실
답변감사합니다.
사실 처음엔 superset이냐 아니냐로 시작했지만, 이젠 그런건 아무래도 좋게 되버렸네요-_-;;
말씀하신대로 superset이냐 아니냐만 따지자면 그래로 통과가 안되므로 superset이 아니라고 하는게 맞는거 같습니다.
댓글 달기