사람들이 C ++에 대해 불평 하고 싶지만 C ++ 대신 C를 선택하려는 이유에 대한 많은 증거를 찾지 못했습니다. C는 거의 문제가되지 않는 것 같습니다. C ++에 이러한 모든 문제가있는 경우 C 하위 집합으로 제한 할 수없는 이유는 무엇입니까? 당신의 생각 / 경험은 무엇입니까?
사람들이 C ++에 대해 불평 하고 싶지만 C ++ 대신 C를 선택하려는 이유에 대한 많은 증거를 찾지 못했습니다. C는 거의 문제가되지 않는 것 같습니다. C ++에 이러한 모든 문제가있는 경우 C 하위 집합으로 제한 할 수없는 이유는 무엇입니까? 당신의 생각 / 경험은 무엇입니까?
답변:
조엘의 대답은 당신이 수있는 이유에 대한 좋은 이 몇 가지 다른 사람들이 있기는하지만, C를 사용 :
그러나 어떤 경우에는 C ++ 대신 C를 사용 하려고 할 수 있습니다 .
C 서브셋을 사용하고 C ++ 컴파일러로 컴파일 할 수 있다고 주장하지만 그렇게하면 컴파일러에 따라 약간 다른 결과를 얻을 수 있습니다.
그럼에도 불구하고, 그렇게하고 있다면 C를 사용하는 것입니다. 실제로 C 프로그래머가 C ++ 컴파일러를 사용하지 않는 이유는 무엇입니까? 그렇다면 언어 차이를 이해하지 못하거나 컴파일러 이론을 이해하지 못합니다.
나는 미니멀리즘과 단순함을 좋아합니다.
성능이나 부풀림에 대한 두려움은 C ++을 포기해야 할 좋은 이유가 아닙니다. 모든 언어에는 잠재적 인 함정과 상충 관계가 있습니다. 좋은 프로그래머는 이에 대해 배우고 필요한 대처 전략을 개발하는 경우 가난한 프로그래머는 파울에 빠지고 언어를 비난합니다.
해석 된 파이썬은 여러면에서 "느린"언어로 여겨지지만 사소한 작업의 경우 숙련 된 Python 프로그래머는 경험이없는 C 개발자보다 빠르게 실행되는 코드를 쉽게 생성 할 수 있습니다.
우리 업계의 비디오 게임에서는 RTTI, 예외 또는 내부 루프의 가상 기능과 같은 것을 피함으로써 C ++로 고성능 코드를 작성합니다. 이들은 매우 유용 할 수 있지만 피해야하는 성능 또는 부풀어있는 문제가 있습니다. 한 걸음 더 나아가서 완전히 C로 전환한다면 C ++의 가장 유용한 구성을 거의 얻지 못하고 잃게됩니다.
C를 선호하는 가장 큰 실질적인 이유는 C ++보다 지원이 더 널리 퍼져 있기 때문입니다. C ++ 컴파일러조차없는 많은 플랫폼, 특히 임베디드 플랫폼이 있습니다.
공급 업체의 호환성 문제도 있습니다. C에는 안정적이고 잘 정의 된 ABI (Application Binary Interface)가 있지만 C ++에는 없습니다. C ++의 ABI는 vtable 및 생성자 / 소멸자와 같은 요소로 인해 더 복잡하므로 모든 공급 업체 및 공급 업체 툴체인 버전에 따라 다르게 구현됩니다.
실제로 이것은 하나의 컴파일러에서 생성 된 라이브러리를 가져 와서 다른 프로젝트의 코드 또는 라이브러리와 링크하여 분산 프로젝트 또는 이진 라이브러리의 미들웨어 공급자에게 악몽을 유발할 수 없음을 의미합니다.
작고 엄격한 언어로 작업하는 것을 즐기기 때문에 C로 작성하기로 결정했습니다. 나는 적당한 시간에 읽을 수있는 표준에 접근하는 것을 좋아한다 (나에게는 매우 느린 독자이다). 또한, 나는 몇 바람직 C ++ 컴파일러 (같은 존재하는 임베디드 시스템을위한 소프트웨어를 작성하는 데 사용하는 일부 PIC 마이크로 컨트롤러).
나는 다른 견해를 취한다. 왜 C 대신 C ++를 사용 하는가?
The C Programming Language (일명 : K & R) 책은 300 페이지 미만에서 언어가 할 수있는 모든 것을하는 방법을 명확하게 알려줍니다. 미니멀리즘의 걸작입니다. C ++ 책도 가까이에 없습니다.
명백한 반론은 현대 언어의 전부는 아니더라도 대부분의 언어에 대해 동일하게 말할 수 있다는 것입니다. 또한 수백 페이지에 모든 것을 수행하는 방법을 알려줄 수는 없습니다. 진실. 그렇다면 왜 C ++을 대신 사용합니까? 풍부한 기능? 힘? 더 풍부하고 강력한 기능이 필요한 경우 C #, Objective C, Java 또는 이와 유사한 기능을 사용하십시오. 왜 C ++의 복잡성에 부담을 줍니까? C ++ 보조금의 정도가 필요하다면 C를 사용한다고 주장합니다. C는 무엇이든 할 수 있고 잘 할 수 있습니다.
귀하의 질문에 대한 Linus의 답변은 "C ++은 끔찍한 언어이기 때문입니다"
그의 증거는 기껏해야 일화이지만, 요점은 ..
더 낮은 수준의 언어이기 때문에 C ++보다 선호합니다 .C ++은 추가 기능을위한 라이브러리 및 컴파일러 지원이 추가 된 C입니다 ( 두 언어 모두 다른 언어가하지 않는 기능이 있으며 다르게 구현하는 경우가 있습니다). C와 시간과 경험, 당신은 별도의 추가 낮은 수준 관련 권한 혜택을 누릴 수 있습니다 ... [편집] (당신이 때문에 익숙해 언어 / 컴파일러 자체에서 오는 어떤 힘에서 더 많은 작업이 아닌 수동 혜택을 수행에)
링크 추가 :
나는 이것에 대해 google .. 웹에 이미 많은 주석이 있기 때문에
플러그인을 작성 중이므로 C ++에는 표준 ABI가 없습니다.
컴파일 시간이 길면 성 가실 수 있습니다. C ++을 사용하면 컴파일 시간이 매우 길어질 수 있습니다 (물론 스택 오버플로에 더 많은 시간이 걸립니다).
저는 프로젝트에 C ++을 사용했습니다. 그런 다음 일반 C가 사용되는 직업을 얻었습니다 (문서가 열악한 AV 소프트웨어의 20 년 된 진화하는 코드베이스 ...).
C에서 내가 좋아하는 세 가지는 다음과 같습니다.
암시적인 것은 없습니다 : 프로그램의 기능이 정확히 무엇인지 알 수 있습니다. 이것은 디버깅을 더 쉽게 만듭니다.
네임 스페이스와 오버로드가없는 것이 유리할 수 있습니다. 특정 함수가 호출되는 위치를 알고 싶다면 소스 코드 디렉토리를 통해 grep하면 알려줍니다. 다른 특별한 도구가 필요하지 않습니다.
함수 포인터의 힘을 재발견했습니다. 기본적으로 C ++에서 모든 다형성 작업을 수행 할 수 있지만 훨씬 유연합니다.
void*
문제를 일으켰을 때 하나의 사례를 기억할 수 없습니다 . 실수로부터 보호 할 수있는 방어적인 프로그래밍 기술이 많이 있습니다. 어설 션을 어디에나 배치하고 (디버그 빌드에서) 구조체에 마법의 숫자를 추가하는 등 현재 요즘에는 valgrind, dr. 메모리와 MSVC조차도 코드를 계측하여 문제를 감지하므로 메모리 손상 문제를 쉽게 분류 할 수 있습니다.
void*
로하는 것은 whatever*
컴파일러가 선의로 받아들이는 무언가이다. 나는 컴파일러가 나를 믿지 않고 강력한 유형 검사를 시행 할 수있는 것을 선호합니다. C ++ 컴파일러가 발행 한 템플릿 대체 오류는 읽기가 어렵지만 최소한 가비지 컴파일은 아닙니다.
void*
일반적으로 피할 수 있습니다. 사용자 지정 동작을 추가 할 때 일반적인 패턴은 함수 포인터와 void*
사용자 데이터를 전달하는 것 입니다. 일반적인 인터페이스는 일반적으로 다음과 같습니다. 그런 다음 라이브러리는 void*
다른 작업을 수행하지 않고 이것을 콜백으로 다시 전달 합니다. 대부분 추가 데이터가 없으므로 NULL을 전달하고 콜백에서 사용자 매개 변수를 무시하십시오. 나는 당신이 이것을 알고 있다고 생각했습니다.
아무도 언급 한 도서관에 놀랐습니다. 많은 언어가 C 라이브러리에 연결하고 C 함수 (extern "C"가있는 C ++ 포함)를 호출 할 수 있습니다. C ++은 C ++ lib ( 'C에없는 C ++의 기능 (예 : 오버로드 된 함수, 가상 메소드, 오버로드 된 연산자 등)를 사용하는 lib로 정의되며 내보낼 수 없음)를 사용할 수있는 유일한 방법입니다. extern "C"를 통한 C 호환 인터페이스를 통한 모든 것).
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"));
std:vector
.
c ++의 중요한 기능 중 대부분은 클래스 또는 템플릿과 관련이 있습니다. 이것은 컴파일러가 객체 코드로 변환하는 방법을 제외하고는 훌륭한 기능입니다. 대부분의 컴파일러는 이름 맹 글링 (mang manling)과 최소한 지저분한 작업을하지 않는 컴파일러를 사용합니다.
많은 응용 프로그램에서와 같이 시스템이 자체적으로 작동하는 경우 C ++이 적합합니다.
시스템이 C ++로 작성된 소프트웨어 (가장 자주 어셈블러 또는 포트란 라이브러리)로 작성되지 않은 소프트웨어와 상호 작용해야하는 경우 문제가있는 것입니다. 이러한 종류의 경우와 상호 작용하려면 해당 기호에 대한 이름 맹 글링을 비활성화해야합니다. 이것은 일반적으로 해당 객체를 선언하여 수행 extern "C"
되지만 템플릿, 오버로드 된 함수 또는 클래스는 될 수 없습니다. 그것들이 애플리케이션 API 일 가능성이 높으면 도우미 함수로 랩핑하고 해당 함수를 실제 구현과 동기화해야합니다.
실제로 C ++ 언어는 순수한 C로 쉽게 구현할 수있는 기능에 대한 표준 구문을 제공합니다.
간단히 말해, 상호 운용 가능한 C ++의 오버 헤드는 너무 높아 대부분의 사람들이 정당화 할 수 없습니다.
이것은 매우 얕지만 바쁜 학생으로서 C ++을 배우는 데 너무 오래 걸릴 것이라고 생각했기 때문에 C를 선택했습니다. 우리 대학의 많은 교수들은 파이썬으로 과제를 받아들이지 않을 것입니다. 나는 빨리 무언가를 선택해야했습니다.
"사용하려는 C ++의 하위 집합 만 사용"에 대한 한 가지 언급은이 아이디어의 문제점은 프로젝트의 모든 사람이 동일한 하위 집합을 사용하도록하는 데 비용이 든다는 것입니다. 내 자신의 견해는 느슨하게 결합 된 프로젝트 (예 : 오픈 소스 프로젝트)의 경우 비용이 상당히 높으며 C ++을 사용하는 곳마다 C ++을 사용할 수 없다는 의미에서 C ++이 더 나은 C가되지 못했습니다.
오, C 대 C ++, 불꽃 전쟁을 시작하는 좋은 방법. :)
C는 드라이버 및 임베디드 코드에 더 적합하다고 생각합니다.
C ++에는 C에는없는 훌륭한 기능이 있지만 C ++의 많은 객체 지향 기능은 사람들이 장면 뒤에서 발생하는 명백하지 않은 부작용으로 코드를 작성할 때 기념비적 인 코딩 혼란을 유발할 수 있습니다. 미친 코드는 생성자, 소멸자, 가상 함수에 숨겨 질 수 있습니다 ... C 코드의 아름다움은 언어가 등 뒤에서 분명하지 않은 것이므로 코드를 읽을 수 있으며 모든 생성자와 소멸자를 찾을 필요가 없습니다. 등등. 많은 문제는 일부 사람들의 나쁜 코딩 관행입니다.
필자의 완벽한 언어는 C99와 ZERO (또는 거의 제로) 컴파일러 오버 헤드를 이진 출력에 추가하는보다 안전한 C ++ 기능의 최소한의 하위 집합입니다. 완벽한 추가는 클래스 캡슐화와 데이터 및 함수의 개념 개념입니다.
C ++ 대신 C를 선택하려는 이유에 대한 많은 증거를 찾지 못했습니다.
내가 증거하려고하는 것을 거의 부를 수 없습니다. 그냥 내 의견 일뿐입니다.
C를 좋아하는 사람들은 프래 머머의 마음 속에 잘 들어 맞기 때문입니다.
C ++에는 여러 가지 복잡한 규칙이 있습니다 [가상 소멸자가 필요할 때, 생성자에서 가상 메소드를 호출 할 수있는시기, 오버로드 및 재정의 방식은 어떻게 상호 작용 하는가 ...]. 그리고이를 모두 마스터하려면 많은 노력이 필요합니다. 또한 참조, 연산자 오버로드 및 함수 오버로드 사이에서 코드 조각을 이해하려면 찾기 쉽지 않을 수도있는 다른 코드를 이해해야 할 수 있습니다.
조직이 C보다 C ++를 선호하는 이유에 대한 다른 질문입니다. 몰라요, 나는 단지 사람입니다 ;-)
C ++ 방어에서는 테이블에 중요한 기능을 제공합니다. 내가 가장 중요하게 생각하는 것은 아마도 parametric ( 'ish) 다형성 일 것입니다 : 하나 이상의 유형을 인수로 취하는 연산과 유형.
++score
: “프로그래머의 마음에 잘 들어 맞기 때문에 C와 같은 사람들” 이라는 말은 아주 훌륭하게 언급 된 것입니다. 자신이 보는 것이 무엇인지 알 수있는 간단한 언어로 프로그래밍 할 수 있다는 것은 프로그래밍 언어의 진정한 매력입니다.
C는 C ++보다 최적화 및 효율성을 더 잘 제어 할 수 있으므로 메모리 및 기타 리소스가 제한되고 모든 최적화가 도움이되는 상황에서 유용 할 것이라고 말합니다. 물론 공간이 더 작습니다.
임베디드 시스템이나 커널과 같은 실제 베어 메탈 코드와 같이 리소스가 부족한 시스템을 작성 중이며 가능한 한 적은 오버 헤드를 원하기 때문입니다.
대부분의 임베디드 시스템에 C ++ 컴파일러가없는 이유가 있습니다. 사람들이 원하지 않는 것이 아니라 C ++ 코드를 작은 공간에 넣는 것이 불가능한 작업입니다.