source

OOP를 제외하고, 왜 C++이 C보다 나은가요?

nicesource 2023. 7. 23. 14:21
반응형

OOP를 제외하고, 왜 C++이 C보다 나은가요?

글쎄요, 트롤 질문처럼 들릴 수도 있지만, C++를 완전히 마스터하기는 어려워 보이기 때문에 (그리고 저는 STL이 실제로 그것의 "일부"라는 것을 결코 알지 못했습니다), 저는 OOP에 많이 의존하지 않을 때 C++ 대신 C를 사용하는 것이 어떤 단점이 있는지 알고 싶었습니다.

C++는 때때로 매우 정교한 구문을 가질 수 있는데, 예를 들어 OGRE3D를 사용하려고 할 때 약간 혼란스럽습니다.

C++에는 없는 OOO 이외의 기능:

  1. 템플릿
  2. 함수 오버로드
  3. 레퍼런스
  4. 네임스페이스
  5. 사용할 수 있습니다.struct모래땅enum▁s고▁without않을 쓰지 않고 s.struct또는enum모든 선언 전에 또는 typedefs를 사용합니다.
  6. 자신의 클래스를 정의하지 않더라도 C++의 문자열 및 컨테이너 클래스를 사용하는 것이 C 스타일 문자열 및 배열보다 더 편리하고 안전하게 작업할 수 있습니다.
  7. 유형 안전(일부에서는 취약하다고 하지만)
  8. 예외
  9. 변수 , 조부변선언수, C99는 에건니다에만 .for

저는 의 열렬한 팬입니다.C시간이 지남에 따라 그의 열렬한 팬이 된 사람.C++그에 대한 큰 이유하나는 STL(Standard Template Library)과 Boost입니다.

이 둘 사이에서 강력한 휴대용 애플리케이션을 매우 쉽게 작성할 수 있습니다.

왜 C++가 C보다 더 나은가요?분명한 기능 목록 외에도, 제 생각에 진짜 답은 여전히 C++ 대신 C를 사용할 좋은 이유가 없다는 것입니다.OOP를 사용하지 않더라도 더 나은 C로 사용할 수 있습니다.프로그램에서 C++의 고유한 기능을 한 번만 사용해도 C++은 이미 승자입니다.

반면에, C++을 사용하는 것에는 단점이 없습니다. C의 성능 목표를 유지하고 매우 강력한 것을 허용하면서도 상당히 낮은 수준의 언어입니다.그리고 C++을 사용하는 C 기능을 놓치지 않을 것입니다!

그리고 광범위한 사용자 기반과 풍부한 라이브러리 및 프레임워크를 사용할 수 있다는 것을 잊지 마십시오.

그나저나, C99는 몇 가지 흥미로운 기능을 추가했지만 10년이 지나도 컴파일러 지원은 매우 제한적입니다(따라서 ANSIC에 구속됩니다).그 사이에 C++도 발전했고 컴파일러 공급업체들은 적합한 구현을 제공하기 위해 노력하고 있습니다.

많이 언급되지 않은 한 가지 "기능"은 C++ 컴파일러 커뮤니티가 적합한 구현을 생성하기 위해 훨씬 더 많은 작업을 기꺼이 하는 것처럼 보인다는 것입니다.결국 C89/90이 된 표준이 작동했을 때 거의 모든 컴파일러 공급업체는 표준의 최신 초안을 준수하기 위해 노력했으며 (특히 표준이 거의 완료되었을 때) 가능한 한 준수하기 위해 많은 노력을 기울였습니다.

더 이상 그렇지 않습니다.C99 표준은 (분명히) 10년 이상 전에 완료되었지만, 기본적으로 전체 표준(Comeau)을 준수하기 위한 진지한 시도를 하는 구현은 단 하나뿐입니다.일부 다른 기능(예: gcc)은 일부 C99 기능을 추가했지만 여전히 상당수의 기능이 누락되어 있습니다.하나(pcc)는 C99에 특정한 거의 모든 기능을 추가했지만 C89/90의 요구 사항을 충족하는 데에는 그다지 근접하지 않는 다소 역설적인 위치에 있습니다.

C++의 복잡성을 고려할 때, 적합한 구현을 생성하는 것은 훨씬 더 어려운 작업입니다.그럼에도 불구하고 이미 C99(약 10년 전 비준)보다 적어도 C++0x(1~2년 후 비준 예정)를 준수하는 구현이 더 많다고 생각합니다.임의의 숫자를 선택하기 위해서는 C99의 3개의 적합한 구현보다 C++0x의1 3개의 적합한 구현을 더 빨리 볼 수 있을 것으로 예상합니다(사실, 저는 비준된 날이 그 많은 것을 거의 예상했습니다).

  1. 물론, 이 경우 "적합"은 "실용적인 정도"를 의미합니다. 저는 C와 C++의 모든 구현에는 완벽한 적합성을 방해하는 최소한 몇 가지 결함이 있다고 확신합니다.대부분의 다른 언어도 마찬가지이며, 특정 구현의 관점에서 정의된 언어만 예외입니다.

참조는 포인터에 비해 자동으로 수행되고 훨씬 안전하며, 표준 라이브러리는 훨씬 더 광범위하며, 템플릿은 코드를 극도로 사용자 지정 가능하고 상당히 빠르고 안전하게 만듭니다.C++는 환상적인 코드 사용/재사용 및 구성을 제공합니다.또한, OOP에 크게 의존하지 않는다면 잘못하고 있는 것입니다.사물이 적절하지 않을 때도 있지만, 대부분의 시나리오는 아닙니다.

C에서 라이브러리를 작성하는 한 가지 이유는 CBI가 C++ ABI인 이름맹그에 비해 매우 간단하기 때문에 여러 언어에서 라이브러리를 사용하기가 매우 쉽기 때문입니다.C++ libs에 대한 C 인터페이스를 만드는 것이 괜찮은 해결책일 수 있지만, 만약 당신이 C 구문으로 API를 쉽게 표현할 수 있다면, 왜 그것을 C++로 작성해야 합니까?

많은 C99 기능은 매우 훌륭하지만 여전히 C++에는 없습니다.

[참고: 이것은 주관적인 반응이지만 질문 자체는 본질적으로 주관적인 반응을 유발하는 경향이 있습니다.]

C++는 다중 패러다임 언어이며 OOP 이상의 많은 것이 있습니다.하지만 단순히 C보다 더 낫다는 것을 제안하는 것은...bold . :-D 숙련된 C 코더의 손에서, 그리고 적절한 목적을 위해, C 코드는 매우 우아하고 단순할 수 있습니다.C로 코드화된 Lua 인터프리터를 생각해 보세요; 그것은 동등하게 숙련된 C++ 프로그래머의 손에서도 훨씬 더 클 가능성이 있는 매우 작은 바이너리로 컴파일되므로 임베디드 사용에 적합합니다.C는 일반적으로 (예: 암시적 캐스팅, 수동 리소스 정리 등) 안전하지 않을 것입니다. 이는 C++이 C보다 조금 더 잘하려고 노력하는 한 가지 일이지만, 또한 어색한 캐스팅 구문으로 프로그래머에게 부담을 주지 않을 것입니다(C++에서는 자주 캐스팅할 필요가 없지만 C에서는 상당히 일반적입니다).

반면에, 저는 매우 일반적으로 말하려고 노력하고 있습니다. C++는 실제로 더 효율적인 코드를 작성할 수 있게 해줍니다. 특히 여러 유형에 걸쳐 작동해야 하는 코드의 경우에는 더욱 그렇습니다.qsort vs std::sort 벤치마크는 C++이 템플릿과 인라인 함수 객체를 통해 비용이 들지 않는 추상화를 제공하는 방법을 보여주는 고전적인 예입니다.C에서는 비슷한 결과를 얻기 위해 모든 유형에 대해 개별 정렬 알고리즘을 손으로 작성하거나 매크로에 입력해야 합니다.

C에서 이주한 대부분의 C++ 프로그래머들은 결코 뒤를 돌아보지 않습니다.저는 괴짜일지 모르지만, 저는 여전히 C가 소규모 라이브러리를 구현하는 데 유용하다고 생각합니다.우선 포팅이 조금 더 쉽고 매우 빠르게 구축됩니다.이런 것들을 위해 저는 암묵적인 캐스팅을 당연하게 생각합니다.하지만 저는 대규모로 C 코드를 사용하는 것을 싫어하며, 안타깝게도 때때로 이 작업을 해야 했습니다.

구체적인 차이점에 대해서는 이미 Sepp2k가 상당히 포괄적인 목록을 지적했습니다.

기본적으로 C 코드를 계속 작성할 수 있지만 C++로 컴파일하여 더 강력한 유형 검사를 통해 더 강력한 코드를 얻을 수 있습니다.

다음 내장된 OOO C++와같이 없는 C++의 유용한 요소를 하고자 할 때 할 수 .bool함수 오버로드 및 더 잘 정의된 상수 처리(문자 그대로 상수 기호에 매크로를 사용할 필요 없음).

다음과 같은 표준 라이브러리의 이해하기 쉬운 요소를 사용하는 것은 너무 무리가 아닙니다.std::stringiostreams, 심지어 std:: 벡터를 "더 나은 배열"로 사용할 수 있습니다. 이러한 향상된 인터페이스를 활용하기 위해 C++을 많이 배우거나 OOP를 이해할 필요가 없습니다.

OOP 사이에는 C++이 지원하는 중간 객체 기반 프로그래밍이 있으며, 이해하고 배우기가 더 간단하며 거의 완전한 OOP만큼 유용합니다.기본적으로 전체 클래스가 아닌 추상적인 데이터 유형을 사용하고 상속 및 다형성을 피합니다.솔직히 말해서 그것은 많은 C++ 프로그래머들이 어떤 경우에도 쓰는 것입니다.

Sepp2k가 언급한 긍정적인 측면 외에도 OOO와 직접적인 관련이 없는 약간의 부정적인 측면도 분명히 있습니다.의 부족함을 생각해 보십시오.__VA_ARGS__사전 처리기 및 컨텍스트 민감도에 사용할 수 있습니다.다음과 같은 것을 생각해 보십시오.

switch (argc) {
 case 1: /* empty statement */;
         toto T;
 case 2: break;
}

마다, C 서가그코러러드만조때각날마다을그에, .argc그리고.toto알려대로유, 이니다합효분 (할 때,에 대한 수도 .)

C++에서 이것은 유형에 따라 다릅니다. toto만약 그것이 POD라면, 모든 것이 정상입니다(글쎄요, C도 마찬가지입니다).생성자가 있는 경우 코드가 올바르지 않습니다. 대소문자로 점프 레이블은 'to T'의 초기화를 교차합니다.

따라서 어떤 의미에서 C++의 경우 제어 흐름이 유효한지 확인하려면 기본 유형을 이해해야 합니다.

언급URL : https://stackoverflow.com/questions/3127721/except-oop-why-is-c-better-than-c

반응형