왜 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.