왜 C ++보다 C ++를 사용하는 사람이 있습니까? [닫은]


132

사람들이 C ++에 대해 불평 하고 싶지만 C ++ 대신 C를 선택하려는 이유에 대한 많은 증거를 찾지 못했습니다. C는 거의 문제가되지 않는 것 같습니다. C ++에 이러한 모든 문제가있는 경우 C 하위 집합으로 제한 할 수없는 이유는 무엇입니까? 당신의 생각 / 경험은 무엇입니까?


정확한 복제 링크가 더 이상 작동하지 않습니다 ..... c 파티에 늦은 사람을 말합니다 :)
— kyle

4
C는 C ++보다 훨씬 더 좋고 간단하지만 모든 C 프로그래머는 C ++를 C로 변환하고 웃을 수 있습니다.
— BobRun

11
가장 무서운 것은 일반적으로 사람들이 "++"가 이것이 실제로 gooooood임을 의미한다고 생각합니다.
— BobRun

소형 / 임베디드 장치와는 별개로, 일반적으로 C는 OOP 기능이 중요한 순수한 수의 크 런칭 문제 (예 : GPU 그래픽 처리, 대규모 병렬 물리 계산, 패턴 마이닝 등)에 좋습니다. C ++은 OOP 기능으로 '사물'이 상호 작용하는 모델링 시스템에 더 좋습니다.
— Paceman

3
JavaScript, 모범 사례, c ++ 및 OOP는 실제로 존재하지 않거나 해결해야 할 이러한 추상 문제를 해결하려는 어리 석거나 너무 바쁩니다.
— 마샬 크래프트

답변:


132

조엘의 대답은 당신이 수있는 이유에 대한 좋은 이 몇 가지 다른 사람들이 있기는하지만, C를 사용 :

  • C에서 증명하고 테스트하기 쉬운 업계 지침을 충족해야합니다.
  • C와 함께 작동하지만 C ++에서는 작동하지 않는 도구가 있습니다 (컴파일러뿐만 아니라 모든 지원 도구, 적용 범위, 분석 등)
  • 타겟 개발자는 C 전문가
  • 드라이버, 커널 또는 기타 저수준 코드를 작성 중입니다.
  • C ++ 컴파일러는 작성해야하는 코드 종류를 최적화하는 데 좋지 않다는 것을 알고 있습니다.
  • 앱은 객체 지향적 일뿐만 아니라 그 형태로 작성하기가 더 어렵습니다.

그러나 어떤 경우에는 C ++ 대신 C를 사용 하려고 할 수 있습니다 .

  • 어셈블러에서 코딩하는 데 어려움이없는 어셈블러의 성능을 원합니다 (C ++은 이론적으로는 '완벽한'성능을 제공 할 수 있지만 컴파일러는 우수한 C 프로그래머가 볼 수있는 최적화를 보는 데 능숙하지 않습니다)
  • 작성중인 소프트웨어는 사소한 것입니다. 작은 C 컴파일러를 꺼내고 몇 줄의 코드를 작성하고 컴파일하면 모든 준비가 완료됩니다. 헬퍼로 거대한 편집기를 열 필요가 없으며 실제로 쓸 필요가 없습니다. 빈 클래스와 쓸모없는 클래스, 네임 스페이스 등을 처리 할 수 ​​있습니다. C ++ 컴파일러를 사용하여 거의 같은 작업을 수행하고 C 하위 집합을 사용할 수는 있지만 작은 프로그램의 경우에도 C ++ 컴파일러가 느립니다.
  • 극한의 성능이나 작은 코드 크기가 필요하며 C ++ 컴파일러가 라이브러리의 크기와 성능으로 인해 실제로 달성하기가 더 어렵다는 것을 알고 있습니다.

C 서브셋을 사용하고 C ++ 컴파일러로 컴파일 할 수 있다고 주장하지만 그렇게하면 컴파일러에 따라 약간 다른 결과를 얻을 수 있습니다.

그럼에도 불구하고, 그렇게하고 있다면 C를 사용하는 것입니다. 실제로 C 프로그래머가 C ++ 컴파일러를 사용하지 않는 이유는 무엇입니까? 그렇다면 언어 차이를 이해하지 못하거나 컴파일러 이론을 이해하지 못합니다.


2
MISRA C 표준도 있습니다. AFAIK는 아직 C ++에서 안정적이지 않습니다.
— Paul Nathan

60
성능 부분이 반드시 사실은 아닙니다. C ++가 C보다 훨씬 더 잘 최적화 할 수있는 영역이 많이 있습니다 (물론 그 반대의 경우도 있지만 일반적으로 성능상의 이유로 C ++ 대신 C를 선택하는 것은 좋지 않습니다).
— jalf

9
더 많은 성능 정보에 관심이 있습니다. 왜 C가 "가끔"더 나은 성능을 발휘하는지 이해하지 못합니다. 평균적인 프로그래머라면 C ++로 성능을 쉽게 얻을 수 있지만 (패턴을 잘 사용함) 전문가가 작성한 C 프로그램은 더 빨라야합니다. 오버 헤드는 줄어 듭니다.
— Adam Davis

3
물론 C 프로그램이 빠를수록 쓰기와 디버그에 시간이 오래 걸리므로 트레이드 오프가 발생하며 기계 속도를 고려할 때 특수 응용 프로그램을 제외하고는 그만한 가치가 거의 없으므로 C ++이 일반적으로 더 좋습니다. (코드가 작성 될 때까지, 컴퓨터는 더 빠르며 dif를 먹습니다)
— Adam Davis

21
@Adam : C ++은 "예쁜"코드로 C보다 성능이 우수합니다. C ++은 C에 매크로가 필요한 템플릿과 인라인 함수를 사용할 수 있습니다. C ++ 오버 헤드는 요청 할 때만 나타납니다. 그렇지 않으면 C와 동일합니다 (가상, 시도 / 던지기, dynamic_cast). 오버 헤드의 대부분은 프로그램 이미지 크기에만 표시됩니다.
— Zan Lynx

88

나는 미니멀리즘과 단순함을 좋아합니다.


9
알았어-충분히 공평 해 ... 왜 Forth?
— Jonathan Leffler

14
그가 도서관, 서적, 포럼을 이용할 수있는 것을 좋아할 것 같습니까?
— gnud

30
나는 당신의 대답의 미니멀리즘과 단순함을 좋아합니다 ... :)
— Joe DF

8
동의하다. C는 매우 간단하고 "작다". C는 항상 똑같이 보이고 프로젝트에 새로운 공헌자 인 경우 어떻게 작동하는지 쉽게 이해할 수 있습니다. c ++에는 많은 쓸모없는 것들이 있으며 c ++ 프로젝트를 볼 때 나는 즉시 혼란스러워합니다. 나는 C ++ 사람들 (OO 기능을 가진 C 언어)을 이해할 수 있지만 C는 더 간단하고 쉽다.
— user69969

1
또한 C는 작은 범용 라이브러리, 스크립팅 언어 및 렌더링 엔진과 같은 일종의 라이브러리를 작성하는 데 훨씬 더 적합한 언어라고 생각합니다.
— keebus

65
  • 그들은 이미 C를 알고 있기 때문에
  • C 컴파일러 만있는 플랫폼을위한 임베디드 앱을 구축하고 있기 때문에
  • 그들은 C로 작성된 레거시 소프트웨어를 유지하고 있기 때문에
  • 운영 체제, 관계형 데이터베이스 엔진 또는 소매 용 3D 비디오 게임 엔진 수준에서 무언가를 쓰고 있습니다.

4
일부 마이크로 컨트롤러에는 실제로 짜증나는 C 컴파일러 만 있습니다. 기본 C ++ 기능 (네임 스페이스, 가상 함수 이외의 클래스, 열거 형, 최상위 블록 이외의 변수 선언)은 가장 가치있는 IMHO입니다.
— Jason S

2
이것으로부터 합리적인 대안이 없다면 C를 선택하는 것처럼 들립니다.

2
@ 조 : 첫 번째 점을 제외하고는 요약합니다. 후기 언어들 중 많은 언어가 C를 사용하여 '야, 우리는 더 잘할 수있다'고 말했다 .
— Joel Coehoorn

1
동의했다. 정교한 C ++ 기능을 사용하지 않는 경우 C ++이 단조롭게 더 나은 C라고 생각합니다. 더 정교한 C ++ 기능을 사용하면 상황이 더 논쟁의 여지가 있지만 일반적으로 토론은 더 높은 수준의 추상화 (예 : Java)와 비교됩니다.
— Paul Nathan

4
실제로 대부분의 3D 게임 엔진은 C ++을 사용합니다. UE4는 주로 C ++을 사용합니다.
— Aditya Kashi

56

성능이나 부풀림에 대한 두려움은 C ++을 포기해야 할 좋은 이유가 아닙니다. 모든 언어에는 잠재적 인 함정과 상충 관계가 있습니다. 좋은 프로그래머는 이에 대해 배우고 필요한 대처 전략을 개발하는 경우 가난한 프로그래머는 파울에 빠지고 언어를 비난합니다.

해석 된 파이썬은 여러면에서 "느린"언어로 여겨지지만 사소한 작업의 경우 숙련 된 Python 프로그래머는 경험이없는 C 개발자보다 빠르게 실행되는 코드를 쉽게 생성 할 수 있습니다.

우리 업계의 비디오 게임에서는 RTTI, 예외 또는 내부 루프의 가상 기능과 같은 것을 피함으로써 C ++로 고성능 코드를 작성합니다. 이들은 매우 유용 할 수 있지만 피해야하는 성능 또는 부풀어있는 문제가 있습니다. 한 걸음 더 나아가서 완전히 C로 전환한다면 C ++의 가장 유용한 구성을 거의 얻지 못하고 잃게됩니다.

C를 선호하는 가장 큰 실질적인 이유는 C ++보다 지원이 더 널리 퍼져 있기 때문입니다. C ++ 컴파일러조차없는 많은 플랫폼, 특히 임베디드 플랫폼이 있습니다.

공급 업체의 호환성 문제도 있습니다. C에는 안정적이고 잘 정의 된 ABI (Application Binary Interface)가 있지만 C ++에는 없습니다. C ++의 ABI는 vtable 및 생성자 / 소멸자와 같은 요소로 인해 더 복잡하므로 모든 공급 업체 및 공급 업체 툴체인 버전에 따라 다르게 구현됩니다.

실제로 이것은 하나의 컴파일러에서 생성 된 라이브러리를 가져 와서 다른 프로젝트의 코드 또는 라이브러리와 링크하여 분산 프로젝트 또는 이진 라이브러리의 미들웨어 공급자에게 악몽을 유발할 수 없음을 의미합니다.


7
"해석 된 파이썬은 여러 가지면에서"느린 "언어로 여겨지지만, 사소한 작업을 위해 숙련 된 파이썬 프로그래머는 경험이없는 C 개발자보다 빠르게 실행되는 코드를 쉽게 생성 할 수 있습니다." 알고리즘을 배우는 프로그래머 (Python Progammer 일 필요는 없음)는 경험이없는 개발자 (일반적으로)보다 빠르게 실행되는 코드를 생성 할 수 있다고 생각합니다.
— Andrei Ciobanu

15
그리고 경험이없는 동일한 c dev는 그의 c 코드보다 느린 파이썬 코드를 생성합니다. 파이썬은 c보다 느립니다.
— Millie Smith

37

작고 엄격한 언어로 작업하는 것을 즐기기 때문에 C로 작성하기로 결정했습니다. 나는 적당한 시간에 읽을 수있는 표준에 접근하는 것을 좋아한다 (나에게는 매우 느린 독자이다). 또한, 나는 몇 바람직 C ++ 컴파일러 (같은 존재하는 임베디드 시스템을위한 소프트웨어를 작성하는 데 사용하는 일부 PIC 마이크로 컨트롤러).


다시 : PICs-당신의 고통을 느낍니다. 많은 PIC 코드를 사용해야하는 경우 C ++를 지원하는 IAR 컴파일러를 사용합니다. MSP430에서 사용했는데 꽤 좋습니다.
— Jason S

1
그리고 C에 대한 컴파일 시간이 크게 향상되었습니다. 템플릿 시스템이 없습니다.
— 엔지니어

35

나는 다른 견해를 취한다. 왜 C 대신 C ++를 사용 하는가?

The C Programming Language (일명 : K & R) 책은 300 페이지 미만에서 언어가 할 수있는 모든 것을하는 방법을 명확하게 알려줍니다. 미니멀리즘의 걸작입니다. C ++ 책도 가까이에 없습니다.

명백한 반론은 현대 언어의 전부는 아니더라도 대부분의 언어에 대해 동일하게 말할 수 있다는 것입니다. 또한 수백 페이지에 모든 것을 수행하는 방법을 알려줄 수는 없습니다. 진실. 그렇다면 왜 C ++을 대신 사용합니까? 풍부한 기능? 힘? 더 풍부하고 강력한 기능이 필요한 경우 C #, Objective C, Java 또는 이와 유사한 기능을 사용하십시오. 왜 C ++의 복잡성에 부담을 줍니까? C ++ 보조금의 정도가 필요하다면 C를 사용한다고 주장합니다. C는 무엇이든 할 수 있고 잘 할 수 있습니다.


나는 동의한다. 나는 힘을 원하기 때문에 1/2 웨이 포인트가 아닌 진정으로 강력한 것을 사용합니다.
— Dinah

7
@Dinah : 1/2 웨이 포인트는 C # 또는 Java의 성능 및 메모리 비용없이 더 높은 수준의 표현력을 제공합니다.
— Zan Lynx

5
@ 잔 Lynx : 당신이 맞아요. 그러나 나는 원래 게시물에서 내가 한 C ++보다 C의 생존 가능성에 대해 지적했다는 반대 입장을 취하기를 희망한다.
— Dinah

28

이미 언급 된 몇 가지 다른 점들 외에도 :

덜 놀라운

즉, 코드 조각이 정확히 무엇을하는지 알기가 훨씬 쉽습니다 . C ++에서는 컴파일러가 생성하는 코드를 정확히 알 수 있도록 전문가 수준에 접근해야합니다 (템플릿, 다중 상속, 자동 생성 생성자, 가상 함수의 조합을 시도하고 네임 스페이스 마법 및 인수 종속 조회를 혼합하십시오).

많은 경우에이 마법은 훌륭하지만, 예를 들어 실시간 시스템에서는 실제로 하루를 망칠 수 있습니다.


27

귀하의 질문에 대한 Linus의 답변은 "C ++은 끔찍한 언어이기 때문입니다"

그의 증거는 기껏해야 일화이지만, 요점은 ..

더 낮은 수준의 언어이기 때문에 C ++보다 선호합니다 .C ++은 추가 기능을위한 라이브러리 및 컴파일러 지원이 추가 된 C입니다 ( 두 언어 모두 다른 언어가하지 않는 기능이 있으며 다르게 구현하는 경우가 있습니다). C와 시간과 경험, 당신은 별도의 추가 낮은 수준 관련 권한 혜택을 누릴 수 있습니다 ... [편집] (당신이 때문에 익숙해 언어 / 컴파일러 자체에서 오는 어떤 힘에서 더 많은 작업이 아닌 수동 혜택을 수행에)

링크 추가 :

임베디드 용 C ++을 선택해야하는 이유

왜 아직도 C를 사용하고 있습니까? PDF

나는 이것에 대해 google .. 웹에 이미 많은 주석이 있기 때문에


17
C에서 많은 코딩을 한 다음 C ++에서 짧은 시간을 보낸 다음 VB를 사용하여 오랜 시간을 보냈으며 이제는 지난 몇 년 동안 C #을 사용했습니다. 그 이후로 약간의 C 및 C ++ 코드를 작성했으며 C가 잘 정의되어 있고 타이트하며 C #이 시원하고 강력하며 C ++가 짜증 난다는 것을 깨달았습니다.
— CMPalmer

25
Linus는 C ++의 장점에 대해 말할 자격이 없습니다. 그가 어떤 종류의 오라클 인 것처럼 인용하는 것은 어리석은 일입니다. 그리고 "어려운 일을하는 것"에 대해서는 조금 이해가되지 않습니다. C를 사용하는 데는 충분한 이유가 있지만 "더 많은 작업"또는 "Linus가 그렇게 말한"것은 그중 하나가 아닙니다.
— jalf

8
@jalf, Linus를 마치 일종의 오라클처럼 인용하지 않고, 세계에서 가장 많이 사용되는 프로그램 중 하나 인 Linux 커널에서 자신이 선택한 프로그래머의 의견을 언급하는 것이 좋습니다. 질문은 내가 대답하려는 목표에 대한 의견 (누군가가 C를 선택 해야하는지)을 묻습니다.
— Ric Tokyo

6
Linus는 C ++에 대한 의견을 제공하기에 좋지 않은 출처입니다.
— Zan Lynx

3
@Zan Linus는 다른 곳에서 더 많은 자체 제어 기능을 보여주었습니다. "우리는 C ++ 및 추가 기능을 사용하고 싶었지만 C ++보다 C ++에서 나쁜 코드가있는 위치를 찾기가 더 어려웠습니다." 내 대답에 대한 인용문은 "지도자를 따르십시오"라기보다는 의견에 대한 기록입니다.
— Ric Tokyo

26

플러그인을 작성 중이므로 C ++에는 표준 ABI가 없습니다.


9
사실이지만 C 연결을 사용하여 필요한 함수를 내보내고 C ++로 구현을 유지할 수 있기 때문에 C를 고수하는 확실한 이유는 아닙니다.
— codelogic 2018 년

2
@codelogic-C ++ 프로젝트는 동등한 C 프로젝트보다 더 많은 유형과 기능을 내보내는 경향이 있습니다. 최종 공유 라이브러리에서 이것을 숨길 수는 있지만 가치보다 훨씬 많은 노력이 필요합니다.
— Tom

C ++의 표준 ABI가 없기 때문에 (예 .. C ++의 짜증) TBH하지 정말 좋은 대답하지만, 한
— 하센

6
C에는 표준 ABI도 없습니다.
— Stephen Canon

25

컴파일 시간이 길면 성 가실 수 있습니다. C ++을 사용하면 컴파일 시간이 매우 길어질 수 있습니다 (물론 스택 오버플로에 더 많은 시간이 걸립니다).


왜 투표가 거부 되었습니까? 나는 C ++에서 많은 일을하고 C로 돌아 가지 않지만 실제로 컴파일 시간이 길어질 수 있습니다 (예 : 템플릿 생각).
— Frank

6
실제 작업에는 C ++을 사용하지만 거의 즉각적인 컴파일 시간으로 인해 항상 C로 프로토 타입을 만듭니다.
— Tom

흠, 옳은 길을 다했을 때, 즉 우리가 필요로하는 것들을 포함하지 않고, 올바른 것을 포함하지 않았는지 확실하지 않다. 컴파일 시간이 깔끔합니다. 하나 또는 세 개의 파일을 해킹하면 100 개의 KLOC 프로젝트를 컴파일하는 데 1-2 초 밖에 걸리지 않습니다.
— Sebastian Mach

4
@Tom : C로 프로토 타입을 만들 수 있다면 실제 작업 C ++의 모습이 궁금합니다. C ++의 기능을 사용하지 않습니까? 정교하게 할 수 있습니까?
— Sebastian Mach

24

저는 프로젝트에 C ++을 사용했습니다. 그런 다음 일반 C가 사용되는 직업을 얻었습니다 (문서가 열악한 AV 소프트웨어의 20 년 된 진화하는 코드베이스 ...).

C에서 내가 좋아하는 세 가지는 다음과 같습니다.

  • 암시적인 것은 없습니다 : 프로그램의 기능이 정확히 무엇인지 알 수 있습니다. 이것은 디버깅을 더 쉽게 만듭니다.

  • 네임 스페이스와 오버로드가없는 것이 유리할 수 있습니다. 특정 함수가 호출되는 위치를 알고 싶다면 소스 코드 디렉토리를 통해 grep하면 알려줍니다. 다른 특별한 도구가 필요하지 않습니다.

  • 함수 포인터의 힘을 재발견했습니다. 기본적으로 C ++에서 모든 다형성 작업을 수행 할 수 있지만 훨씬 유연합니다.


8
+1 그러나 C에서 이러한 다형성은 일반적으로 void *를 통해 얻습니다. 이는 컴파일러가 불쾌한 일을하고 있는지 확인할 수 없기 때문에 위험합니다.
— gd1

4
@ gd1 실제로 이것이 void*문제를 일으켰을 때 하나의 사례를 기억할 수 없습니다 . 실수로부터 보호 할 수있는 방어적인 프로그래밍 기술이 많이 있습니다. 어설 션을 어디에나 배치하고 (디버그 빌드에서) 구조체에 마법의 숫자를 추가하는 등 현재 요즘에는 valgrind, dr. 메모리와 MSVC조차도 코드를 계측하여 문제를 감지하므로 메모리 손상 문제를 쉽게 분류 할 수 있습니다.
— Calmarius

4
내 프로그램에서 메모리 손상이 거의 발생하지 않지만 가능한 경우 프로그램을 실행하기 전에 실수를 감지하는 것이 좋습니다. 주조 void*로하는 것은 whatever*컴파일러가 선의로 받아들이는 무언가이다. 나는 컴파일러가 나를 믿지 않고 강력한 유형 검사를 시행 할 수있는 것을 선호합니다. C ++ 컴파일러가 발행 한 템플릿 대체 오류는 읽기가 어렵지만 최소한 가비지 컴파일은 아닙니다.
— gd1

1
@ gd1 첫 번째 의견으로, 절차 기술에 대해 얼마나 많은 경험을 가지고 있는지 잘 모르겠습니다 (주로 OO 태그에서 활동하고 있음). void*일반적으로 피할 수 있습니다. 사용자 지정 동작을 추가 할 때 일반적인 패턴은 함수 포인터와 void*사용자 데이터를 전달하는 것 입니다. 일반적인 인터페이스는 일반적으로 다음과 같습니다. 그런 다음 라이브러리는 void*다른 작업을 수행하지 않고 이것을 콜백으로 다시 전달 합니다. 대부분 추가 ​​데이터가 없으므로 NULL을 전달하고 콜백에서 사용자 매개 변수를 무시하십시오. 나는 당신이 이것을 알고 있다고 생각했습니다.
— Calmarius

@Calmarius "대부분의 추가 데이터가 없습니다"-> 이것은 실제로 다형성의 이점입니다. void 포인터를 사용하지 않고도 추가 데이터를 쉽게 바인딩 할 수 있습니다. 따라서 귀하의 변명은 기본적으로 "어쨌든 그 기능을 실제로 사용하지는 않습니다"입니다.
— user2445507

15

아무도 언급 한 도서관에 놀랐습니다. 많은 언어가 C 라이브러리에 연결하고 C 함수 (extern "C"가있는 C ++ 포함)를 호출 할 수 있습니다. C ++은 C ++ lib ( 'C에없는 C ++의 기능 (예 : 오버로드 된 함수, 가상 메소드, 오버로드 된 연산자 등)를 사용하는 lib로 정의되며 내보낼 수 없음)를 사용할 수있는 유일한 방법입니다. extern "C"를 통한 C 호환 인터페이스를 통한 모든 것).


1
별로; "C"를 extern하거나 함수를 __cdecl하여 C에 노출시킬 수 있습니다.
— Crashworks

훌륭하지만 다른 언어와 작동하는 것은 무엇입니까?
— BigSandwich

2
C 라이브러리는 훨씬 더 많은 곳에서 작동 할 수 있습니다.
— BigSandwich

1
C.에 연결할 수있는 모든 것
— Crashworks

2
상호 운용성 문제의 가장 분명한 이유는 이름-만들기 (mang-mangling)이기 때문에 이것이 가치가 있다고 생각합니다.
— Tom


12

C ++에는 해당 기능이없는 C99의 기능을 사용하려고하기 때문입니다.


그러나 사람들이 언뜻 생각하는 것처럼 C ++에 유용한 C99 기능은 많지 않습니다. 가변 길이 배열? C ++에는 std :: vectors가 있습니다. 복소수 또는 허수를 지원합니까? C ++에는 템플릿 형식의 복합 유형이 있습니다. 타입 제네릭 수학 함수? C ++은 표준 수학 함수를 오버로드하여 동일한 결과를 발생시킵니다.

명명 된 이니셜 라이저? C ++에는 없지만 해결 방법이 있습니다.

struct My_class_params {
    int i;
    long j;
    std::string name;

    My_class_params& set_i(int ii)
    {
        i = ii;
        return *this;
    }

    My_class_params& set_j(long jj)
    {
        j = jj;
        return *this;
    }


    template <typename STRING>
    My_class_params& set_name(STRING&& n)
    {
        name = std::forward<STRING>(n);
        return *this;
    }

    My_class_params()
    {
        // set defaults
    }
};

class My_class {
    My_class_params params;
  public:
    My_class(const My_class_params& p) : params(p) { }
    ...
};

이를 통해 다음과 같은 내용을 작성할 수 있습니다.

My_class mc(My_class_params().set_i(5).set_name("Me"));

들어 봐! C ++에 명명 된 지정된 초기화 프로그램이 없기 때문에 사용할 때마다 벽을 몰아 넣습니다.
— ephemient

2
이니셜 라이저에 100 %가 있습니다!
— 판사 Maygarden

함수 외부에서 전역 구조를 초기화하려면 (.set _ * () 할 수 없음) C ++은 명명되지 않은 초기화 구문을 사용하거나 구조체의 생성자를 작성하도록합니다. 나는 그 옵션 중 하나를 좋아하지 않습니다.
— ephemient

C99 (GCC)에는 VLA보다 작업하기가 훨씬 더 쉽습니다 std:vector.
— Vahid Amiri

10

많은 프로그래밍 작업에서 C는 더 단순하고 충분하기 때문입니다. 특히 경량 유틸리티를 프로그래밍 할 때 C ++은 단순히 코드를 작성하는 대신 자체적으로 고급 대체 구조로 빌드하기를 원한다고 느낄 수 있습니다.

OTOH는 더 복잡한 프로젝트를 위해 우아하게 키보드에서 흘러 나오는 것보다 더 견고한 견고한 구조를 제공합니다.


8

c ++의 중요한 기능 중 대부분은 클래스 또는 템플릿과 관련이 있습니다. 이것은 컴파일러가 객체 코드로 변환하는 방법을 제외하고는 훌륭한 기능입니다. 대부분의 컴파일러는 이름 맹 글링 (mang manling)과 최소한 지저분한 작업을하지 않는 컴파일러를 사용합니다.

많은 응용 프로그램에서와 같이 시스템이 자체적으로 작동하는 경우 C ++이 적합합니다.

시스템이 C ++로 작성된 소프트웨어 (가장 자주 어셈블러 또는 포트란 라이브러리)로 작성되지 않은 소프트웨어와 상호 작용해야하는 경우 문제가있는 것입니다. 이러한 종류의 경우와 상호 작용하려면 해당 기호에 대한 이름 맹 글링을 비활성화해야합니다. 이것은 일반적으로 해당 객체를 선언하여 수행 extern "C"되지만 템플릿, 오버로드 된 함수 또는 클래스는 될 수 없습니다. 그것들이 애플리케이션 API 일 가능성이 높으면 도우미 함수로 랩핑하고 해당 함수를 실제 구현과 동기화해야합니다.

실제로 C ++ 언어는 순수한 C로 쉽게 구현할 수있는 기능에 대한 표준 구문을 제공합니다.

간단히 말해, 상호 운용 가능한 C ++의 오버 헤드는 너무 높아 대부분의 사람들이 정당화 할 수 없습니다.


3
extern "C"인터페이스를 가진 C ++로 너무 많은 .DLL을 작성 했으므로 C 나 다른 CLR 언어에서 호출 할 수 있기 때문에이 점을 매우 깜짝 놀랐습니다. 확실히 멤버 함수 포인터를 노출시킬 수는 없지만 __cdecl 호출을위한 데이터를 마샬링하는 것은 그리 어렵지 않습니다.
— Crashworks

1
실제로 템플릿 코드를 내보낼 수 있습니다. 이름 충돌을 피하기 위해 사용하려는 모든 유형에 대해 템플릿이 아닌 함수 래퍼 만 있으면됩니다.
— 판사 Maygarden

8

이것은 매우 얕지만 바쁜 학생으로서 C ++을 배우는 데 너무 오래 걸릴 것이라고 생각했기 때문에 C를 선택했습니다. 우리 대학의 많은 교수들은 파이썬으로 과제를 받아들이지 않을 것입니다. 나는 빨리 무언가를 선택해야했습니다.


8
선생님의 현명한!
— Andrei Ciobanu

6

"사용하려는 C ++의 하위 집합 만 사용"에 대한 한 가지 언급은이 아이디어의 문제점은 프로젝트의 모든 사람이 동일한 하위 집합을 사용하도록하는 데 비용이 든다는 것입니다. 내 자신의 견해는 느슨하게 결합 된 프로젝트 (예 : 오픈 소스 프로젝트)의 경우 비용이 상당히 높으며 C ++을 사용하는 곳마다 C ++을 사용할 수 없다는 의미에서 C ++이 더 나은 C가되지 못했습니다.


6

오, C 대 C ++, 불꽃 전쟁을 시작하는 좋은 방법. :)

C는 드라이버 및 임베디드 코드에 더 적합하다고 생각합니다.

C ++에는 C에는없는 훌륭한 기능이 있지만 C ++의 많은 객체 지향 기능은 사람들이 장면 뒤에서 발생하는 명백하지 않은 부작용으로 코드를 작성할 때 기념비적 인 코딩 혼란을 유발할 수 있습니다. 미친 코드는 생성자, 소멸자, 가상 함수에 숨겨 질 수 있습니다 ... C 코드의 아름다움은 언어가 등 뒤에서 분명하지 않은 것이므로 코드를 읽을 수 있으며 모든 생성자와 소멸자를 찾을 필요가 없습니다. 등등. 많은 문제는 일부 사람들의 나쁜 코딩 관행입니다.

필자의 완벽한 언어는 C99와 ZERO (또는 거의 제로) 컴파일러 오버 헤드를 이진 출력에 추가하는보다 안전한 C ++ 기능의 최소한의 하위 집합입니다. 완벽한 추가는 클래스 캡슐화와 데이터 및 함수의 개념 개념입니다.


C + 또는 C100을 이름 : _)
— m3nda

4

C ++ 대신 C를 선택하려는 이유에 대한 많은 증거를 찾지 못했습니다.

내가 증거하려고하는 것을 거의 부를 수 없습니다. 그냥 내 의견 일뿐입니다.

C를 좋아하는 사람들은 프래 머머의 마음 속에 잘 들어 맞기 때문입니다.

C ++에는 여러 가지 복잡한 규칙이 있습니다 [가상 소멸자가 필요할 때, 생성자에서 가상 메소드를 호출 할 수있는시기, 오버로드 및 재정의 방식은 어떻게 상호 작용 하는가 ...]. 그리고이를 모두 마스터하려면 많은 노력이 필요합니다. 또한 참조, 연산자 오버로드 및 함수 오버로드 사이에서 코드 조각을 이해하려면 찾기 쉽지 않을 수도있는 다른 코드를 이해해야 할 수 있습니다.

조직이 C보다 C ++를 선호하는 이유에 대한 다른 질문입니다. 몰라요, 나는 단지 사람입니다 ;-)

C ++ 방어에서는 테이블에 중요한 기능을 제공합니다. 내가 가장 중요하게 생각하는 것은 아마도 parametric ( 'ish) 다형성 일 것입니다 : 하나 이상의 유형을 인수로 취하는 연산과 유형.


2
++score: “프로그래머의 마음에 잘 들어 맞기 때문에 C와 같은 사람들” 이라는 말은 아주 훌륭하게 언급 된 것입니다. 자신이 보는 것이 무엇인지 알 수있는 간단한 언어로 프로그래밍 할 수 있다는 것은 프로그래밍 언어의 진정한 매력입니다.
— tchrist December

3

C는 C ++보다 최적화 및 효율성을 더 잘 제어 할 수 있으므로 메모리 및 기타 리소스가 제한되고 모든 최적화가 도움이되는 상황에서 유용 할 것이라고 말합니다. 물론 공간이 더 작습니다.


이것들의 예를 들어 줄 수 있습니까?
— Andrew Grant

따라서 C 컴파일러를 사용하여 컴파일 한 동일한 C 코드가 C ++ 컴파일러를 사용하여 컴파일 된 경우보다 더 효율적입니까?
— Steve Kuo

1
몇 년 전 리눅스 커널은 gcc 또는 g ++로 컴파일 할 수 있었지만 g ++는 느린 코드 ( tulin.org/lkml/#s15-3 에서 "Finally, Linus는 개발 커널을 유지하는 중 ..."아래)를 만들었습니다 .
— Max Lybbert 2019 년

C ++보다 C에서 코드가 최적화되는 방식을 더 많이 제어 할 수 있다고 생각합니다. 어셈블리 언어를 사용하는 프로그래머가 더 높은 수준의 언어를 사용하는 코드보다 코드를 더 정확하게 조정할 수있는 방법과 유사합니다.
— Chris

2

일부 상점 에서는 C와 같은 방식으로 C ++의 기능 중 일부 를 사용 하지만 반대하는 기능은 피하는 방식도 있습니다. 예를 들어, 클래스와 클래스 메소드 및 함수 오버로딩 (일반적으로 C 다이어 드조차도 쉽게 처리 할 수 ​​있음)을 사용하지만 STL, 스트림 연산자 및 부스트 (배우기 어렵고 나쁜 메모리 특성을 가질 수 있음)는 사용하지 않습니다.


1

임베디드 시스템이나 커널과 같은 실제 베어 메탈 코드와 같이 리소스가 부족한 시스템을 작성 중이며 가능한 한 적은 오버 헤드를 원하기 때문입니다.

대부분의 임베디드 시스템에 C ++ 컴파일러가없는 이유가 있습니다. 사람들이 원하지 않는 것이 아니라 C ++ 코드를 작은 공간에 넣는 것이 불가능한 작업입니다.


3
언어로서 C ++ 자체의 문제는 많지 않지만 템플릿을 무차별 적으로 사용하는 병리학적인 팽창이 발생할 수 있습니다.
— Crashworks

1
ecos는 주로 C ++로 작성되었습니다. 언어 (C와 비교)와 실행 가능한 크기 (사용할 기능을 알고있는 한) 사이에는 관계가 없습니다.
— user52875

1
"사용할 기능을 알고있는 한". 요점은 "글쎄, 우리는 C ++을 가지고 있지만 오버 헤드 이유로 언어 기능의 절반을 지원할 수 없다"고 말한 결과는 C 프로그래머 와 C ++ 프로그래머 모두를 혼란스럽게하고 화나게하는 Symbian / C ++입니다 ...
— Steve Jessop

1
모든 점에서 동의했습니다. "사용할 기능을 아는"솔루션은 C 컴파일러를 사용하여 하루에 호출하는 것입니다. 물론, 우리는 C ++ 작업을 만들 수 있었지만 (이것은 정말 대단한 방식으로 재미 있었을 것입니다) 우리는 선적 할 제품이 있었고 걱정할 시간이 없었습니다.
— Electrons_Ahoy

1

C에 필요한 것은 더 나은 전 처리기였습니다. cfront는 하나이므로 c ++로 태어났습니다.

'C ++를 전 처리기'로 사용할 수없는 C를 사용하겠습니다.

잘 작성된 C ++ 라이브러리 / 프레임 워크 / 툴킷의 맨 아래에 dirty-old-c (또는 정적 캐스트, 동일)가 있음을 확신합니다.


0
  • 몇 년 전까지 기존 C ++ 컴파일러에는 중요한 기능이 없거나 지원이 열악하고 지원되는 기능이 크게 다르기 때문에 휴대용 응용 프로그램을 작성하기가 어려웠습니다.
  • 표준 심볼 이름이 없기 때문에 다른 언어 / 응용 프로그램이 C ++ 클래스를 직접 지원하기가 어렵습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.