C over C ++ 및 C ++ over C를 언제 사용해야합니까?


164

1 년이 조금 넘게 Computer Science에 소개되었으며, 경험상 C와 C ++는 모두 "초고속"언어로 간주되는 반면 Python 및 스크립팅 언어와 같은 다른 언어는 일반적으로 다소 느리게 간주됩니다 .

그러나 소프트웨어 프로젝트 또는 작은 프로젝트조차도 특정 수의 n 개 파일이 C로 작성되고 특정 수의 m 개가 C ++로 작성된 파일을 인터리브하는 경우가 많이 있습니다.

(또한 C ++ 파일에는 거의 항상 해당 헤더가 있지만 C 파일은 그다지 많지 않습니다). 그러나 필자의 주요 요점은 C ++보다 C를 사용하는 것이 적절한 경우와 C보다 C ++을 사용하는 것이 더 나은 경우에 대한 일반적인 직관을 얻는 것입니다. (1) C ++은 객체 지향이지만 C는 그렇지 않으며 (2) 구문은 매우 유사하며 C ++은 의도적으로 C와 여러 가지 방식으로 유사하게 만들어 졌으므로 차이점이 무엇인지 잘 모르겠습니다. 많은 도메인에서 (거의) 완벽하게 상호 교환 가능한 것으로 보입니다.

누군가가 상황을 해결할 수 있다면 감사하겠습니다! 감사


4
C ++ 코드에서 C 인라인을 사용하는 것은 일반적으로 고도로 최적화해야하거나, 하드웨어에 대한 매우 낮은 수준의 작업을 수행하거나, 데이터의 무결성 또는 사람의 안전에 중요하며 감사 및 검증이 필요한 특정 모듈을위한 것입니다. C에서 모든 작업을 수행하는 대신, 대량의 프로젝트는 유연한 디자인을 위해 C ++ 기능을 활용할 수 있으며 필요한 곳에서 C의 견고 함을 활용할 수 있습니다.
kylben

30
@ kylben : 많은 C ++ 사람들은 당신에게 말할 것입니다 : (1) 성능은 C로 떨어질 이유가 아닙니다 (아마도 virtual최적화를 방해하는 몇 가지 다른 기능을 피할 수는 있지만 비 virtual클래스는 본질적으로 비효율적이지 않으며 템플릿은 실제로 보다 효율적으로 qsort연결될 수있는 강력한 추상화 도구 ( 예 : vs std::sort) (2) 정확성의 중요성은 C보다 C ++ (typesafety, constness private,, RAII를 사용하여 자원 관리를 관리하기 쉽게 만드는 것) 을 사용하는 이유 입니다.

11
@ Pubby8 나는 이것에 동의하지 않습니다. .c 파일을 작업 중이고 사람들이이 작업을 수행하는 것을 본다면, 내가하는 일을 모르는 것으로 정신적으로 신고하는 경향이 있습니다. 예를 들어, void*C 코드에서 다른 포인터 유형 으로 캐스트 할 필요 가 없습니다. C를 모르는 사람들에게는 매우 산만하고 일반적입니다.
asveikau

4
@kylben : (귀하의 의견 답변에서 다른 사람을 올바르게 처리하는 방법을 배우고 싶을 수 있으므로 실제로 기회가 있습니다.) "컴파일러가 C를 asm으로 바꾸는 방법에 매우 익숙한 프로그래머"는 C ++에서도 다음과 같이 작동합니다. 잘. 그러나 그것은 단순히 관련이 없습니다 : asm을 다루고 싶다면 컴파일러가 다른 언어로 작성하지 말고 asm을 작성하십시오. 이렇게하는 방식은 결국 모든 컴파일러 업데이트에서 변경 될 수 있습니다.
sbi

9
내 겸손한 의견으로는 ... 당신이 원할 때 C를 사용합니다 .C는 C ++보다 훨씬 간단하고 사용하기 쉽습니다 ... C ++는 "C With classes"처럼 보일 수 있지만 더 이상은 아닙니다. 가상 생성자 및 템플릿과 같은 매우 복잡한 언어.
dysoco 2016 년

답변:


184

때 C를 선택

  • 어떤 이유로 든 휴대용 어셈블러 (C가 실제로있는 것)가 필요합니다.
  • 귀하의 플랫폼은 C ++를 제공하지 않습니다 (C 컴파일러는 구현하기가 훨씬 쉽습니다)
  • C 와만 상호 작용할 수있는 다른 언어 (대개 모든 플랫폼에서 가장 낮은 공통 분모)와 상호 작용해야하며 코드는 C ++ 코드보다 C 인터페이스를 배치 할 가치가없는 인터페이스 이상으로 구성됩니다.
  • 오픈 소스 프로젝트를 해킹합니다 ( 다양한 이유로 C를 고수합니다).
  • 당신은 C ++을 모른다.

다른 모든 경우에는 C ++을 선택해야합니다.


15
또한 예외 모델이있는 C ++은 때로는 OS 커널과 같은 가치보다 더 많은 문제를 야기한다고 덧붙였습니다. 적어도 그것은 물건에 대해 읽는 동안 얻은 일반적인 느낌입니다.
Coder

12
@SF : C는 링구아 프랑카입니까? 새로운 소식입니다. 아니면 오히려 아주 오래된 것입니다. 지난 20 년 동안 새로운 언어를 배우지 않은 사람들과 만 대화를한다면 C 지식은 더 이상 일반적이지 않다고 말할 수 있습니다.
DeadMG

13
@SF .: 다른 곳에서 작성한 것처럼 저는 수백만 LoC 에 달하는 프로젝트에 참여했으며 필연적이고 유비쿼터스 매크로 해커가있는 C 프로젝트와 비교할 때 메타가 거의 없습니다. (OTOH, 필요할 때 EDSL을 생성하는 기능은 상자에서 믿을 수 없을만큼 강력한 도구가 될 수 있습니다.) C는 링구아 프랑카입니다. 저는 그것이 가장 일반적인 공통 분모라는 용어를 고수하고 싶습니다. 그리고 나는 적당한 프로그래밍 기술을 가진 사람들이 OS 커널에서 해킹하는 것을 원하지 않습니다.
sbi

18
@Max : 나는 완전히 동의하지 않습니다. 극복 할 수없는 실질적인 장벽이 C ++의 사용을 방해하지 않는 한 C는 쓸모없는 언어입니다.
DeadMG

17
@ 단추 : 클레임을 만든 사람 ( "C ++에 더 많은 메모리가 필요함")이이를 백업하는 사람이되어야합니다. 그리고 아니오, C ++에 메모리 가 필요하다고 주장하지 않습니다 . 내가 말하고있는 것은 컴파일러가 당신을 위해 그것을 구현하는지 (가상 함수) 또는 당신이 직접 (함수 포인터의 배열) 수행하든 관계없이 기능 비용입니다.
sbi

88

C를 선호하는 데는 몇 가지 이유가 있습니다. 가장 큰 이유는 C ++로 정말 작은 실행 파일을 만드는 것이 더 어렵다는 것입니다. 실제로 작은 시스템의 경우 어쨌든 많은 코드를 작성하는 경우가 거의 없으며 C가 아닌 C ++에 필요한 추가 ROM 공간이 중요 할 수 있습니다.

그러나 또한 아주 작은 시스템의 경우 C는 정확히 같은 이유로 문제가 있으며 어셈블리 언어는 거의 유일한 합리적인 선택입니다. C가 실제로 이해하는 시스템 크기의 범위는 매우 작으며 지속적으로 줄어들고 있습니다 (그러나 상당히 느리게 인정할 것입니다).

C를 사용하는 또 다른 시간 / 이유는 본질적으로 다른 언어에서 바인딩 할 수있는 일련의 기능을 제공하는 것입니다. 당신은 할 수 로 정의하여 C ++에서이 기능을 쓰기 extern "C"기능, 하지만 이렇게하면 세계에 본질적으로 C-생활 "얼굴"을 제시하는 이러한 기능 제한 - 등 클래스, 오버로드 기능, 템플릿 및 멤버 함수를, 필요가 없습니다 대다. 이것이 반드시 개발을 C로 제한하는 것은 아니며 외부 인터페이스가 C처럼 보이는 한 C ++ 기능을 내부적 으로 사용하는 것이 합리적입니다 .

동시에 @Toll의 답변 (한 가지 분명한 예)의 경우 대부분의 경우 거꾸로 일이 있다고 말합니다. 합리적으로 작성된 C ++는 일반적으로 적어도 C만큼 빠르며, 종종 적어도 조금 빠릅니다. 가장 사소한 알고리즘 및 데이터 구조, 모든 오류 처리 등을위한 모든 코드의 눈사태에 묻히지 않기 때문에 가독성은 일반적으로 훨씬 좋습니다.

템플릿은 "언어 유형 시스템의 문제를 해결하지"않으며 템플릿없이 C 및 / 또는 C ++에 거의없는 몇 가지 기본 기능을 추가합니다. 원래 의도 중 하나는 유형이 안전한 컨테이너를 제공하는 것이었지만 실제로는 C를 제공하지 않는 컨테이너보다 훨씬 뛰어납니다.

자동화 된 도구는 대부분 붉은 청어이기도합니다. C 파서를 작성하는 것이 C ++ 파서를 작성하는 것보다 작업이 적다는 것이 사실이지만, 실제로는 사실상 차이가 없습니다. 아주 적은 수의 사람들이 어느 쪽이든 사용할 수있는 파서를 작성하거나 기꺼이 작성할 수 있습니다. 따라서 합리적인 출발점은 Clang입니다.

C와 C ++는 같은 사람들이 함께 관리하는 같은 프로젝트에서 함께 사용되는 경우가 많습니다. 이것은 다른 방법으로는 아주 드물다. 전체적으로 동등하게 유능한 사람들 (즉, 정확히 같은 사람들)에 의해 두 언어로 작성된 코드의 유지 관리 성을 직접, 객관적으로 비교 하는 연구 . 최소한 연결된 연구에서 한 가지 결론은 명확하고 분명합니다. "C 대신 C ++를 사용하면 소프트웨어 품질이 향상되고 유지 관리 노력이 줄어든다는 것을 알았습니다."


12
도구 지원은 청어 가 아닙니다 . 당연히 오늘날 우리에게는 씨족이 있습니다. 그러나 C ++에 대한 도구를 지원 하지 심지어 큰 샷의 IDE에 상당히 데르 언어 뒤에 지연. 왜 그런 겁니까? 아주 최근까지 clang이 없었기 때문에 GCC가 대안이 아니기 때문에 간단합니다. 반년 전까지 만해도 C ++ 코드의 AST가 필요한 경우 기본적으로 운이 없거나 수천 달러 (EDG 프론트 엔드를 구입 한 경우)였습니다.
Konrad Rudolph

5
+1로 기록을 위해 4KiB ROM이있는 8 비트 프로세서 용 C ++ 코드를 정기적으로 작성합니다.
avakar

2
전체적으로 좋은 답변을 얻으려면 +1하십시오. 내가 이해 하지 못하는 것은 (이것은 경험이 없다) 왜 (내가 말하고 있다고 생각 하는가?) C 컴파일러는 사용 된 동일한 기능 세트가 주어지면 C ++ 컴파일러보다 작은 실행 코드를 생성해야 합니까? 어쩌면 당신은 몇 가지 참조를 제공 할 수 있습니까?
Martin Ba

2
@Martin : 가장 중요한 것은 C ++에 예외 처리가 포함되어 있다는 것입니다.이 예외 처리는 (적어도 보통) 실행 파일 크기에 최소값을 추가합니다. 대부분의 컴파일러는 예외 처리를 비활성화 할 수 있지만 결과가 더 이상 C ++이 아닙니다. 많은 C ++ 컴파일러 공급 업체가 가능한 가장 작은 출력 코드를 생성하는 데 열심히 노력하지 않는다는 단순한 사실도 약간 의심합니다.
Jerry Coffin

3
"우리는 C 대신 C ++를 사용하면 소프트웨어 품질이 향상되고 유지 관리 노력이 줄어든다는 것을 알았습니다."
Stephane Rolland

24

C와 C ++의 차이점은 이미 여기 에 자세히 나와 있습니다 . 때로는 사람들이 하나 또는 다른 것을 선택 해야하는 합법적 인 이유가있을 수 있지만 (예를 들어 C ++의 추가 기능으로 인해 바람직하지 않은 오버 헤드가 발생하는 경우 OOP 또는 C의 경우 C ++) 내 경험상 일반적으로 선호에 달려 있습니다. 이 파일을 작업하는 사람들은 무엇을 더 잘 알고 좋아합니까? 이 언어가 성능에 중요한 응용 프로그램을 모두 다루는 것이 사실이기 때문에 이것이 대부분의 이유라고 생각합니다.

(Side-note : Linus Torvads가 C를 C ++보다 선호하는 이유를 확인하십시오 . 필자의 요점에 반드시 동의 할 필요는 없지만 사람들이 C ++보다 C를 선택하는 이유에 대한 통찰력을 제공합니다. 이러한 이유로 C를 선택할 수 있습니다.)


51
-1리누스의 분노. :-{
sbi

12
저를 빼지 마십시오! 하하. 나는 Linus에 동의하지 않지만, 사람들이 C ++ 대신 C ++을 선택하는 이유 (Linus가 믿는 것을 믿는다면)의 좋은 예입니다. 나는 그 이유의 정당성에 대해 언급하고 있지 않습니다.
Casey Patton

10
@CaseyPatton : 기본적으로, 나는이 수사적 언쟁을 언급하지 않은 모든 답변을 마치 그것이 실제 논증 인 것처럼 비판합니다.
sbi

11
@ Coder : STL 구현을 전혀 알 필요가 없습니다. STL의 요점은 표준에 의해 정의되지 않은 행동에 의존하지 않는 한 구현을 알 필요가 없다는 것입니다. 어떤 경우에 표준 라이브러리를 사용하는 것이 귀찮습니까? 또한 개발자의 행동 방식 때문에 언어를 좋아하지 않는 것은 미친 짓 이상입니다. C 프로그래머는 C가 사람에게 하나님의 선물 인 것처럼 행동하고 C ++이 RAII와 같이 C보다 근본적으로 본질적으로 직접적으로 우수한 기능을 제공한다는 명백한 진실을보기에는 너무 맹목적입니다.
DeadMG

8
@ Coder : 단일 카운터에 너무 많은 shared_ptr을 사용하여 내부 카운터를 오버플로하면 잘못하고 있습니다. 표준은 카운터에 대한 최소 크기 (32 비트)를 지정하며 하나의 단일 객체에 20 억 개 이상의 shared_ptr을 가져야한다는 것은 비현실적입니다. 객체 자체의 크기가 0이고 오버 헤드가 0 인 메모리 할당자가 있더라도 여전히 shared_ptrs에서 16GB의 메모리를 사용하고 있습니다.
DeadMG

13

기존 답변에서 누락 된 주요 문제는 (이 게시물 시점 현재) 선택입니다.

간단 해. 완전히 비이성적 인 이유로 예외가 오버 헤드의 가치가 있다고 생각하지 않으면 예외 를 사용할 필요가 없습니다 . 여전히 템플릿, RAII 및 표준 라이브러리를 가질 수 있으며 단일 "throw"를 작성하지 마십시오. 템플릿도 마찬가지입니다. 어떤 이유로 든 그들이 취소 할 수없는 (실제로 포함되어있는) 실행 가능한 팽창을 일으키는 느낌이 든다면 놀랍습니다-void *와 sizeof (T)도 하루 종일 사용할 수 있습니다. C보다 C ++ 기능을 사용하도록 강요하는 것은 없습니다.

그렇기 때문에 C ++는 본질적으로 우수한 언어입니다. 원하는 기능을 원하는대로 고르고 주어진 기능을 싫어하면 C 스타일 프로그래밍으로 넘어갈 수 있습니다. 따라서 C ++가 C와 그 이상이라는 것을 감안할 때 C ++이 우수한 언어라는 것은 명백한 사실입니다. 달리 제안하는 것은 4가 5보다 크다고 제안하는 것과 같습니다.


1
당신의 추론에 따라 원래의 질문에 전혀 아무런 의미가 없으므로 종결해야합니다. 나는 질문을 다음과 같이 읽어야한다고 생각합니다 : 언제 우리가 C ++의 C 하위 세트로 제한해야합니까 (일반 C 사용) 언제 완전한 C ++을 사용하는 것이 합리적입니까?
Giorgio

이것은 사실이지만 한 사람이 자신의 작은 프로젝트를 수행하는 경우에만 해당됩니다. 실제로 거의 모든 사람들이 다른 사람의 코드를 작성하는 데 절반의 시간을 할애합니다. 불행히도 대부분의 다른 사람들은 완전히 비이성적 인 이유로 "잘못 생각한다".
DarenW

1
@DeadMG : 할당자는 예외를 발생시키지 않고 오류를보고하는 방법은 무엇입니까? 또한 더 많은 기능을 추가하는 것이 복잡성이나 중복성을 추가하는 것만으로 더 나은 것은 아닙니다.
Mankarse

@Mankarse : 예외를 비활성화하는 옵션으로 컴파일하면 할당자는 프로그램을 중단하거나 라이브러리 구현에 따라 널 포인터를 사용합니다.
잔 Lynx

4
@Mankarse : 2007 년에 1GB RAM으로 Linux 시스템을 실행하고 스왑을 시도하지 않은 경험으로 인해 메모리 할당이 실패하면 거의 모든 데스크탑 소프트웨어가 끔찍한 방식으로 실패합니다.
Zan Lynx

9

C 프로그래머를 불안하게 만드는 C ++에 관한 것들

후드 아래에서 많은 마술이 일어나고 있습니다. 생성자, 소멸자, 가상 메서드, 템플릿 등은 C ++ 코드를 동등한 C 코드보다 훨씬 쉽고 빠르게 작성할 수 있지만 이해하고 추론하기는 어렵습니다 (C ++ 및 관련 규칙을 얼마나 잘 알고 있는지에 따라 다름). 클래스의 생성자 (그리고 그 클래스가 의존하는 클래스)가 어떻게 정의 되어 있는지에 따라 많은 코드를 Foo newFoo;호출 할 수있는 간단한 것이 있습니다. postfix는 종종 값 비싼 복사 작업을 포함하기 때문에 컨테이너를 반복 할 때 대신에 규칙을 작성 해야하는 이유이기도합니다 . Foo++itit++++

수행중인 작업에 따라 특히 간단한 작업의 경우 약간의 오버 헤드 가 발생할 있습니다. 다음 두 프로그램을 수행하십시오. 첫 번째는 C, 두 번째는 C ++입니다.

/* C version */
#include <stdio.h>
int main(void)
{
  char greeting[] = "Hello, world";
  printf("%s\n", greeting);
  return 0;
}
/* end C version */

/* C++ version */
#include <iostream>
#include <string>
int main(void)
{
  std::string greeting("Hello, world");
  std::cout << greeting << std::endl;
  return 0;
}
/* end C++ version */

동일한 동작, 소스 측면에서 많은 차이는 없지만 gcc 4.1.2로 작업하는 SLES 10 상자에서 전자는 ~ 9kb의 실행 파일을 생성하지만 두 번째는 12.5kb를 넘습니다 (최적화는 수행하지 않음) ), 거의 28 % 더 큽니다. C ++ string유형은 C 문자열 라이브러리보다 IMO로 작업하기가 훨씬 쉽고 C ++ 스트림은 C 스트림보다 훨씬 유연하고 사용자 정의가 가능하지만 실제로 이와 같은 뇌 죽은 코드의 경우 오버 헤드 가치 없을 수 있습니다.

C ++는 C 와 비교할 때 엄청나게 복잡한 의미를 가진 거대한 언어입니다. C보다 C ++에 능숙 해지는 데 시간이 더 오래 걸립니다. 즉, C ++를 알고 있다고 주장하는 많은 사람들은 자신이 생각하는 것만 큼 잘 알지 못한다는 것을 의미합니다.

C ++ 프로그래머를 불안하게 만드는 C에 관한 것들

C는 상상력의 확장에 의한 안전한 프로그래밍 언어가 아닙니다. 배열에 검사를 더 경계는 (지금은 죽은 사람을 통해 일 악용 행동을 많이로 연결하지 gets, 또는 통해 기능 scanf%s%[변환 지정자). C ++은 최소한 현재 정의 된 범위 밖에서 액세스하려고하면 예외를 발생시키는 컨테이너를 제공합니다. C가 제공하는 모든 것은 운이 좋으면 분할 위반입니다.

C의 메모리 관리는 C ++이 제공하는 도구와 비교할 때 매우 노동 집약적이며 오류가 발생하기 쉽습니다. 자신의 컨테이너를 빌드하는 경우 모든 mallocfree호출 을 일치 시키고 할당이 성공했는지 확인하고 오류가 발생할 경우 부분 할당을 철회해야합니다. C ++에서는 항목을 용기에서 품목을 제거하십시오. 문제가 있으면 예외가 발생합니다.

마찬가지로 C에서 오류 처리는 C ++에서 제공하는 도구 (예 : 예외)와 비교할 때 문제가 많습니다. 정말 재미있는 것은 많은 메모리를 할당 한 다음 처리 과정에서 벽을 치는 경우입니다. 취소해야 할 때 올바른 순서로 해당 메모리를 해제해야합니다. C ++ 및 RAII 원칙을 사용하면 비교적 비교적 쉽습니다.

그렇다면 언제 다른 것을 사용합니까?

작성중인 내용이 간단하다면 입력 및 출력 성능 문제에 대해 명확하게 설명 할 수있는 응용 프로그램을 읽고 / 제거하고 응용 프로그램을 제거하십시오 .C ++보다 C를 선호하십시오. 그렇지 않으면 C ++을 선호하십시오.


2
메모리 관리는 복잡하고 오류가 발생하기 쉬운 경우가 있지만 특히 임베디드 세계에서는 완전히 정적 메모리 할당을 사용하여 C 프로그램을 작성하는 것이 실용적입니다. 프로그램이 연결되면 런타임에 메모리가 부족할 수 없습니다 . C ++에서 이러한 보장을 쉽게 달성 할 수 있습니까?
supercat

9

Bjarne Stroustrup은 C ++를 사용하는 응용 프로그램 및 회사 목록을 유지 관리합니다 . 절차 적 대 OOP 프로그래밍에 대해서는 논쟁 할 수 있지만 지난 20 년 동안 업계 결과에 대해서는 논쟁 할 수 없습니다.

C ++은 일반적으로 별도의 사람들이 모듈화 된 구성 요소를 작업해야하는 대규모의 다 인간 복잡한 프로젝트 에 사용됩니다. 물론 C로 모듈화 된 코드를 빌드하고 유지할 수는 있지만 C ++의 고유 한 OOP 특성은 뛰어난 모듈화, 테스트 가능성 및 코드 재사용으로 이어집니다.

벡터와 맵만있는 C ++ 표준 라이브러리 (STL)는 C ++을 사용하기에 충분한 이유입니다.

C는 일반적으로 임베디드 시스템에 사용됩니다.

C API 만있는 라이브러리가있는 경우에만 개인적으로 C를 사용합니다.


19
마지막 문장은 C를 사용하는 이유가 아닙니다. C ++에서 C 라이브러리를 호출 할 수 있습니다.
user207421

2
나는 c가 아닌 DSP 프로젝트에 c ++를 사용했다
BЈовић

9

나는 C ++ 대신 C ++를 선택하는 주된 이유는 "이것은 1000 % 안정성을 유지해야한다"고 NASA와 같은 것들에 의지해야 할 때 뿐이라고 말한다.

C ++는 성능을 볼 때 ~ 99 % C이며 훨씬 더 생산적입니다. 따라서 C에서도 C ++보다 빠른 코드를 작성할 수 있습니다 (예외, 가상, 스트리밍, 추상화 등없이 C ++의 하위 세트를 사용할 수 있지만 기본적으로 C입니다). STL은 이미 테스트되었지만 이미 수행하고 있지만 STL 알고리즘은 전문가 그룹에서 작성했기 때문에 달성 할 수있는 작은 성능 이상의 비용이 들며, 모든 전문가가 아닐 수도 있습니다.

반면에 C ++에는 수많은 추상화가 있습니다. 상황에 따라 누출되면 문제가 발생합니다. 그리고 C ++ gotchas를 100 % 아는 사람들은 거의 없으며, 모든 C gotchas를 아는 사람이 많으므로 모든 팀원이 모든 단계를 완전히 이해하는 솔루션을 작성하는 것이 C에서 훨씬 쉽습니다.

예 : shared_ptr<smthn>참조 횟수가 언제 오버플로 되는지 , 예외가 발생 하는지 알고 있습니까? 셔틀이 대기로 다시 들어가야 할 때 이러한 것들이 시원하지는 않습니다. 적어도 그렇게 생각합니다.

또한 예외 처리는 오류 코드에 비해 매우 어렵습니다. 클래스가 100 % 예외 안전하고 누출되기 쉬운 지 알기가 어렵습니다. 많은 대표자들이이 의견을 표명했습니다.


12
그리고 어떤 방식으로 C ++의 추상화 등과 같은 방식으로 메모리를 "보다 안정적으로"수동으로 관리 std::string합니까? shared_ptr의 카운터가 오버플로 될 플랫폼을 지정하려고 시도한 적이 있습니까? 그것은 재미있는 플랫폼 중 하나 일 것입니다. 예외 처리가 어렵다고 생각하면 모든 함수 호출에서 가능한 모든 오류를 확인하는 C 코드를 살펴 봐야합니다. (이러한 코드는 이해하기 어렵지만, 이것은 귀하의 진술에 대한 더욱 강력한 주장 일뿐입니다.) 죄송합니다. 그러나 이것은 실제로 소의 배설물입니다.
sbi

12
@Lundin : ""1000 % 안정적이어야한다 "구현은 우선 동적 메모리 할당을 허용하지 않습니다. ' 그리고 C ++에서 정확히 그렇게하지 못하게하는 것은 무엇입니까 ?? (그리고 논증을 제공하기보다는 나의 지식과 경험에 대한 포괄적 인 진술을하는 것은 다소 값싼 수법입니다.)
sbi

10
@ 룬딘 : 수사학보다는 논증을 제공하기 시작했습니다. 그러나 그들은 약합니다. C ++ (템플릿)의 주요 기능 중 하나를 잊어 버린 것은 코드를 더 안전하게 만드는 것입니다 (알고리즘을 실행할 수 있기 때문에 컴파일 타임에 오류가 발생하여 런타임 오류 제거). 당신이 판단하는 언어에 대한 지식에 찬성하여 말하십시오. OO 언어로의 C ++의 감소는 여기에 비판되어 왔으며 그 이유는 다음과 같습니다. (결정 론적 파괴가있는 클래스는 훌륭한 도구이며 단순한 메모리 이외의 다른 리소스를 관리하는 데 도움이됩니다.)
sbi

9
@Lundin 물론 std::string동적 할당을 원하지 않는다면 사용하고 싶지 않을 것 입니다. 을 사용 std::basic_string<char, std::char_traits<char>, some_allocator_here>합니다.
Luc Danton

10
@ 코더 : 당신은 이것으로 무엇을 증명한다고 생각합니까? 첫 번째는 단순히 잘못된 코드이며 반환 값만큼 나쁜 오류가 발생합니다. 두 번째는 반 정도의 C ++ 개발자가 응원하는 수동 정리보다 RAII 의 경우입니다. 그를 존중하고, 내가 강하게 동의하지 않는 몇 가지 말을했다. 싱글 엔트리 싱글 출구 출구에 대한 그의 플러그는 25 년 전에 배운 것이 뛰어나다는 것에 결코 동의하지 않는 정보가없는 오래된 방귀를 심하게 악용합니다. (난 당신을 마음 SESE은 예술의 상태 일 때 이십오년 전 프로그램.)
SBI

6

C는 구문이 개선 된 이식 가능한 어셈블리로 프로그래머가 모든 것을 완벽하게 제어 할 있습니다.

반면에 C ++은 펑키 마술 (가상 함수, 과부하, 자동 변환 등)을 많이 수행하여 원하는 경우 바람직하지 않을 수 있습니다.

  • 당신이 원하는 것보다 더 많은 메모리를 사용하지 마십시오
  • 메모리 페이지에 액세스하지 않음 willy nilly (vtable은 어디에나있을 수 있음)
  • 실수로 많은 코드를 호출하지 마십시오

성능에 중점을두기 때문에 작업하기가 정말 쉬운 것을 원합니다.

놀랍지도 않고 매우 귀중합니다.

군용 항공 전자 공학 제어를 위해 C ++를 작성할 때 고려해야 할 사항에 대한 JSF 코딩 지침 을 읽으십시오 . 거기에는 많은 함정이 있으므로 알아 두어야 할 수도 있습니다. Bjarne은이 문서의 일부이므로 해당 내용을 알고 있습니다.

또한 C는 번개에 맞은 비열한 트롤처럼 컴파일됩니다. C ++, OTOH는 아마도 SSD 회사에 투자 한 사람들이 후원했을 것입니다. :)

(개인적으로 C ++을 선호하지만 마음에 들지 않습니다 ...; .P)


1
C가 제어 할 수없는 많은 것들이 있습니다. uint32_t에 uint32_t를 곱하여 uint32_t 결과 (제품의 32 비트 아래)를 생성하는 효율적인 이식 가능한 코드를 작성하십시오. a int가 64 비트 인 경우 uint64_t정의되지 않은 동작을 방지하기 위해 하나 이상의 피연산자를 캐스트해야 하지만 32 비트 결과를 계산하기 위해 64 비트로 캐스트해야하는 것은 "놀랍게도" "놀랍다"입니다.
supercat

그렇지 않습니다. 컴파일러는 레지스터 할당과 같은 작업을 수행합니다. CI에서 어셈블리로 유지 관리 가능한 코드를 작성할 수 없습니다.
Nils

2

(두 언어에 대해 잘 알고 있다면)

플랫폼에 C ++ 컴파일러가 없으면 C ++로 이동하십시오. 원하지 않는 언어 부분 (클래스, 예외, 가상 상속, 적용하려는 개인 제한 없음)없이 C ++ 코드를 작성할 수 있으며 나중에 언젠가 원하는 경우 결국 이러한 기능을 사용하면 쉽게 사용할 수 있습니다. C ++의 어떤 것도 C 스타일 코드를 작성할 수 없습니다.

플랫폼에 C ++ 컴파일러가 있다면 C ++ 대신 C를 선택할 이유가 없습니다. 나중에 확장 할 수 있도록 문을 열어 둔 채 오늘날 원하는 언어의 하위 집합으로 제한 할 수 있습니다.


1

두 언어 모두 우수합니다. 나는 많은 포스터가 각각의 강점과 다양한 용도를 상세하게 묘사했다고 생각합니다. 간단히 추가하겠습니다.

나는 C 언어가 4 가지 영역에서 완벽하다고 본다. 1) 어떤 종류의 프로그래밍 (어셈블리와 기계어 코드 지식과 결합 됨)을 처음 배울 때 사용하는 것이 가장 좋은 언어라고 생각한다. 소프트웨어 및 4) 가장 낮은 수준의 시스템 소프트웨어.

C ++은 객체 지향 언어이지만 절차적일 수도 있습니다 (C와 매우 유사). 대규모 프로젝트, GUI 기반 소프트웨어, 게임 소프트웨어 및 기타 그래픽 집약적 소프트웨어를 작업하는 경우 C ++, Java 또는 Objective-C가 최선의 선택이라고 생각합니다. 그러나 C ++가 C보다 우수하거나 더 우수하다는 것을 알 수있는 많은 명령 행 프로그램 또는 시스템 소프트웨어가 있습니다.


0

필자의 의견으로는이 토론에서 한 가지 누락 된 점이 있습니다 .C에서는 라이브러리에서 안정적인 이진 인터페이스를 제공하는 것이 더 간단합니다. C ++뿐만 아니라 다른 언어와 함께 사용할 수 있습니다.

C ++에서 다른 컴파일러는 다른 이름 맹 글링을 사용하므로 라이브러리와 다른 컴파일러로 컴파일 된 라이브러리의 소비자는 그것을 사용하는 데 문제가있을 수 있습니다. C를 사용하면 일반적으로 이진 인터페이스가 플랫폼에 대해 표준화됩니다.

오늘날 컴파일러에는 종종 gcc 호환 항목을 생성하는 스위치가 있지만 항상 도움이되는 것은 아닙니다.

나는 솔라리스에서 이것을 비교적 자주 관찰한다. 배포판과 다른 소프트웨어 공급 업체는 일반적으로 특히 Sparc 시스템에서 Sun Studio를 사용하여 더 나은 결과를 제공합니다. 사람 오픈 소스 프로젝트는 gcc 특정 코드로 작성됩니다. 사람들이 함께 일하도록하는 데 약간의 고통이있을 수 있습니다.


0

C 코드가 생성 될 때 (예를 들어, 고급 언어의 구현에서) C는 C ++보다 선호 될 것입니다 . 예를 들어,이 C 코드를 방출 여러 리스프와 같은 컴파일러 (예입니다 치킨 , Scheme48 ...)하지만 난 진짜 C ++ 코드를 방출 아무도 몰라 (내 용융 도구는 C ++ 코드를 방출,하지만 난 진짜 그 코드를 호출하지 않습니다 C ++ 코드, C ++ 기능이 거의 사용되지 않습니다).

C 코드는 반자동으로 쉽게 증명할 수 있습니다. Frama-C 와 같은 정적 분석기 (코드에 대한 이유를 증명하기 위해 ACSL 주석으로 C 코드에 주석을 추가하는 위치)는 C에서 사용할 수 있지만 완전한 C ++ 11에서는 그다지 많지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.