C / C ++라는 용어 사용을 중단해야합니까?


140

나는 C와 C ++이 다른 언어라는 것을 이해하지만 C ++을 배우고있을 때 항상 C는 C ++의 하위 집합 이거나 C ++는 클래스가있는 C라고 들었습니다. 그리고 그것은 C ++ x0, C ++ 11 (또는 일반적으로 현대적인 C ++ 11/14/17)이 나타날 때까지 사실이었습니다. 실제로 (특히 임베디드 시스템에서 작업 할 때) C ++로 작성된 코드를 찾을 가능성이 높지만 대부분 순수한 C 언어로 작성된 많은 부분이 있습니다. 여기 몇 가지 질문이 있습니다.

  1. C / C ++라는 용어 사용을 중단해야합니까?
  2. # 1에 대한 대답이 예라면 C와 C ++를 혼합하여 사용하는 프로그램을 어떻게 호출합니까?
  3. 둘 다 '다른'언어 인 경우 C ++ 컴파일러는 C 언어로 작성된 코드 지원을 중단 할 가능성이 있습니다 (현대 c ++은 포인터, 동적 메모리 처리 등과 같은 기본 사항에 대해 C 사고 방식에서 벗어나기 때문에)
  4. 호환성을 유지하기 위해 C / C ++ 표준을 만드는 사람들 간의 협력이 지금 있습니까?
  5. # 4가 맞다면 , 그러한 협업은 근래의 c ++ (11/14/17) 의 등장과 함께 가까운 미래에 끝날 수 있습니다.

나는 이미 비슷한 질문이 있다는 것을 알고 있지만 많은 사람들 이이 질문을 공유 할 것이라고 확신하므로 가까운 장래에 C ++ 경향과 관련된 점에 대해 좋은 답변을 얻는 데 매우 관심이 있습니다.


35
그리고 C ++ x0, C ++ 11 아니요, C89가 C ++ 98의 하위 집합이 될 때까지는 조용했습니다 .

35
Should I stop using the term C/C++. 예. 채용 담당자 및 HR 만 사용합니다. 엔지니어는 용어를 사용 C하거나 C++독립적 인 언어. 용어를 혼합 한 엔지니어를 찾으면 피하십시오.
Martin York

8
@LokiAstari : 정말? SQLite 개발자는 HR이 있다고 생각합니다. 오픈 포지션이 없기 때문입니다. 이것은 엄청나게 제한적인 견해입니다 (귀하의 상황에있는 다른 사람들이했던 것처럼 내 대답을 내려 보내십시오).

4
@greyfade : 어느 곳에서나 흔히 볼 수있는 일련의 문자를 주장 할 수 있다고 가정하는 것은 좋지 않습니다. "C / C ++"는 특정 언어에 대해 선택된 이름 일 수 있지만 "C / C ++"의 사용이 해당 웹 사이트를 복사하고 "C / C ++"를 "C ++ 1z"초안 C ++ 표준에 대한 모든 논의가 갑자기 잘못된 용어를 사용하고있을 것입니다. 간단히 말해서, 문자열 "C / C ++"은 "C / C ++"라는 농담 언어를 참조한 적이 없으며 결코 그렇게하지 않을 것입니다.
Ben Voigt

32
@TomDworzanski, stroustrup.com/bs_faq.html#C-is-subset "엄격한 수학적 의미에서 C는 C ++의 하위 집합이 아닙니다 ... 그러나 C ++는 C에서 지원하는 모든 프로그래밍 기술을 지원합니다 ... 그렇지 않습니다 몇 시간 만에 수만 줄의 C를 C 스타일 C ++로 변환 할 수있는 경우가 드물기 때문에 ANSI C는 K & R C의 수퍼 세트이고 ISO C ++은 잘 쓰여진 C는 합법적 인 C ++이기도합니다. 예를 들어 Kernighan & Ritchie의 모든 예제 : "C Programming Language (2nd Edition)"도 C ++ 프로그램입니다. "
Ben

답변:


183

C는 결코 C ++의 하위 집합이 아닙니다. 가장 확실한 예는입니다 int new;. 이것은 C89와 C ++ 98 이후로 사실이었으며, 새로운 표준이 나오면서 언어는 서로 더 멀어졌습니다.

C / C ++라는 용어 사용을 중단해야합니까?

# 1에 대한 대답이 예라면 C와 C ++를 혼합하여 사용하는 프로그램을 어떻게 호출합니까?

소스 파일은 한 언어로 작성됩니다. 프로그램은 함께 작동하는 여러 언어의 코드 또는 서로 다른 컴파일 된 객체를 연결하여 생성 된 실행 파일로 구성 될 수 있습니다. 프로그램이 C 및 C ++로 작성되었다고 말할 수 있습니다. "C / C ++"는 언어가 아닙니다.

둘 다 '서로 다른'언어 인 경우 C ++ 컴파일러가 C 언어로 작성된 코드 지원을 중단 할 가능성이 있습니다

3) 그들은 결코하지 않았다. char *a = malloc(10);. CC ++ 는 ISO 표준을 가지고있는 한 최소한 완벽하게 호환되지 않았습니다 (사전 표준화 된 날짜에 대한 모든 세부 사항을 모릅니다). C89 이상에서는 문제가 없지만 C ++ 표준에서는 유효하지 않은 파일에 대해서는 링크를 클릭하거나 아래를 참조하십시오.

4) afaik 아니오, 실무 그룹은 서로를 알고 있지만 표준은 자신에게 가장 적합한 결정을합니다.

/* A bunch of code that compiles and runs under C89 but fails under any C++ */

/* type aliases and struct names occupy separate namespaces in C, not in C++ */
struct S { int i; };
typedef int S;


struct Outer { struct Inner { int i; } in; };
/* struct Inner will be Outer::Inner in C++ due to name scope */
struct Inner inner;


/* default return type of int in C, C++ functions need explicit return types */
g() {
    return 0;
}


/* C sees this as two declarations of the same integer,
 * C++ sees it as redefinition */
int n;
int n;


/* K&R style argument type declarations */
void h(i) int i; { }


/* struct type declaration in return type */
struct S2{int a;} j(void) { struct S2 s = {1}; return s; }


/* struct type declaration in argument, stupid and useless, but valid */
/*void dumb(struct S3{int a;} s) { } */


/* enum/int assignment */
enum E{A, B};
enum E e = 1;


void k() {
    goto label; /* C allows jumping past an initialization */
    {
        int x = 0;
label:
        x = 1;
    }
}


/* () in declaration means unspecified number of arguments in C, the definition
 * can take any number of arguments,
 * but means the same as (void) in C++  (definition below main) */
void f();

int main(void) {
    f(1); /* doesn't match declaration in C++ */
    {
        /* new is a keyword in C++ */
        int new = 0;
    }

    /* no stdio.h include results in implicit definiton in C.  However,
     * as long as a matching function is found at link-time, it's fine.
     * C++ requires a declaration for all called functions */
    puts("C is not C++");
    {
        int *ip;
        void *vp = 0;
        ip = vp; /* cast required in C++, not in C */
    }
    return 0;
}

/* matches declaration in C, not in C++ */
void f(int i) { }

저는 항상 C Objective-C의 하위 집합 이라는 것을 언급 할 가치가 있다고 생각합니다 .


59
Objective-C는 특별히 구문이 충돌하지 않고 완전히 직교하는 객체 시스템으로 C의 엄격한 수퍼 세트가되도록 설계되었습니다. 이것은 실제로 "Objective-C"의 "Objective"부분을 가져 와서 Objective-MODULA-2를 생성하는 다른 언어로 연결시킬 수 있도록 극단으로 이루어집니다. 가장 유명한 것으로 Apple의 Objective-C ++는 완전히 직교하는 비 상호 작용하는 비 통합 객체 시스템 2 개 를 갖추고 있습니다.
Jörg W Mittag

20
OP가 실제 C의 슈퍼 세트가 어떻게 보이는지보고 싶다면 @masonwheeler.
xhainingx

26
"소스 파일은 한 언어 또는 다른 언어로 작성되었습니다." 표준 C99와 C ++ 89로 깨끗하게 컴파일되는 프로그램에 알려주십시오. 어느 언어도 다른 언어의 하위 집합은 아니지만 널리 사용되는 두 세트 의 교차점 이 있습니다. Lua 등을 참조하십시오.
munificent

28
@munificent 나도 실행할 수있는 C ++ 코드를 작성할 수 javac있지만 요점은 무엇입니까?
xhainingx

22
@munificent C, / bin / sh 및 f77의 세 가지 언어로 컴파일 할 수있는 프로그램의 예는 IOCCC 1986의 applin.c 항목입니다. 정의에 따르면 태그 C/Fortran/sh는 이제 의미 가 있습니까 ?! ioccc.org/years-spoiler.html#1986 .
Sjoerd

108

이 용어는 자주 함께 모여 이유가 될 수 있습니다. C 교사에게 그의 언어가 C ++의 일부라는 것을 말해서는 안되지만 여기에는 몇 가지 진실이 있습니다. 다른 사람들은 이미 선생님의 관점을 공개했습니다. 이것은 매우 좋습니다 (예 등으로 설명). 그러나 우리는 상아탑이나 책에 살고 있지 않습니다.

당신의 큰 상사는 당신이 사용한 정확한 언어에 대해 덜 신경 쓰지 못했습니다. 그가 프로그래밍에 대해 조금 알고 있다면 C / C ++를 사용했다고 말하면 "DLL과 복잡한 모든 것들을 기계 코드로 컴파일해야하는 언어를 사용했다"고 들릴 것입니다. 이것이 "외부 커뮤니케이션"부분입니다.

C와 C ++로 인터페이스 할 수있는 라이브러리를 작성하는 경우이를 C / C ++ 라이브러리라고합니다. 물론 누군가가 손을 들고 왜 C ++ 래퍼가있는 C 라이브러리라고 부르지 않는지 묻습니다. 어쨌든 C ++은 C 라이브러리에 연결할 수 있으므로 전혀 언급 할 필요가 없습니다. "예, 맞습니다. 이것은 C / C ++ 라이브러리입니다."라고 대답하십시오. 이것이 "내부 커뮤니케이션"부분입니다.

C ++ 용 어휘 분석기를 작성하면 C와의 작동 방식에 놀랄 것입니다. 모두 수정하지 않아도됩니다. 이것은 "오리처럼 보이는 경우"입니다. 부품.

기타.

내가 본 C 프로그램의 대부분은 C ++ 코드로 수정하지 않고 컴파일 및 작동합니다. 몇 가지 예외 나 독단적 인 (그러나 영향력있는) 프로그래머가 직관을 속이지 않도록하십시오. C와 C ++는 C / C ++라는 용어가 사용 되기에 너무 가깝고 호환성이 높으며 종종 혼합되어 일치합니다. Java 또는 PHP가 아닌 한 C 또는 C ++을 고려하고 있는지 여부는 중요하지 않은 상황을 설명하는 것이 유용하기 때문에 사용됩니다 . 우리는 그것이 "잘못된"것을 알고 있지만, 신경 쓰지 않습니다. 그것은 잘못된 것보다 더 유용합니다.

그것은 남용 될 수도 있고, 어리석은 것일 수도 있지만, 여전히 필요한 것보다 더 풍족한 태도를 취함으로써 어떤 혜택을 받을지 확신하지 못하고 다른 사람들이 이해하는 용어로 의사 소통을 거부합니다. 특정 상황에서 불안하다고 느끼면 C / C ++이라는 일반적인 용어를 사용하지 말고 사례와 관련된 용어를 사용하십시오 (C 또는 C ++).

미래를 두려워하지 마십시오. 우리의 운영 체제는 C로 작성되었습니다. 현재 많은 C / C ++ 소프트웨어 제작이 C ++로 이루어집니다. 이 커플은 꽤 오랫동안 머물러 있습니다. 어느 쪽도 다른 쪽과 더 호환되지 않는 것에 관심이 없습니다 (실제로 다른 쪽).

요점을 구체적으로 설명하려면 :

1) 다릅니다. 혼동을 일으킬 수 있거나 불안 함을 느끼거나 단순히 잘못되었거나 상황에 맞지 않을 때 가능합니다. 그것이 적절하다고 생각할 때 아닙니다.

2) N / A

3) 아니오라고 생각하지만 수정 구슬이 없습니다.

4) 전혀 모른다

5) 나는이 방향으로 아무것도 밀리지 않을 것이라고 생각하지 않습니다.


7
소음이 커지면서 댓글이 삭제되었습니다.
ChrisF

3
왜 이렇게 많은 투표가 있습니까? 부정확 함과 허위 주장으로 가득합니다!
Zaibis

5
@Zaibis 어느 주장이 허위이거나 부 정확한지에 대해 충분히 확장 할 수 있습니까?
usernumber

3
당신의 논리에 따라 C / C ++ / Objective-C / Fortran / Pascal은 유효한 표현이어야하지만 이것은 어리석은 소리입니다. C / C ++라는 용어의 문제점은 여러 가지를 의미하므로 원하는 의미를 전달할 것이라는 보장이 없습니다. 제 연습에서 사람들은 일반적으로 "C는 C ++의 오래된 기본 버전입니다"라고 이해하며 이는 잘못된 것입니다.
martinkunev

4
이 용어의 본질적인 타당성을 넘어서는 C/C++분명한 것이 아니므로 유용하지 않습니다. 예제에 따라 C/C++ librarya는 C ++ 래퍼가있는 C 라이브러리 또는 C 래퍼가있는 C ++ 라이브러리를 의미 할 수 있습니다. 또는 라이브러리가 여러 모듈로 구성되어 있음을 의미 할 수 있습니다. 일부는 C ++로 컴파일되고 일부는 C로 컴파일됩니다. 이것은 명확하지 않습니다. 나에게 도서관이 만들어 졌다고 말하는 것이 C and C++훨씬 더 명확하거나 C library with compatibility with C++더 명확하다. 그리고 여기 모호성은 두 랭입니다 ... 이상이 "커뮤니케이션 전략"을 사용하여 상상
gaborous

43

흐름에 반해서 나는 그것이 상황에 달려 있다고 말할 것이다 .

"C / C ++"라는 용어는 "이것은 C / C ++ 프로그램입니다"와 같은 말에는 일반적으로 적합하지 않지만 다른 답변에서 심층적으로 탐구되었습니다.

그러나 C / C ++가 적합한 컨텍스트가있을 수 있습니다.

  • 일반적으로 C 및 C ++ API가 모두있는 다양한 라이브러리가 있습니다. 그런 것을 C / C ++ 라이브러리라고 부르면 사실과 멀지 않은 것 같습니다. 우리 인간은 정보를 압축하는 것을 좋아하기 때문에 "opencv는 C / C ++ 라이브러리"라는 말은 짧고 명확하며 이해할 수 있습니다. "opencv는 라이브러리이며 C와 C ++ 모두에 헤더가 포함되어 있습니다"와 비교할 수 있습니다.
  • 언어 디자인과 구문에 대해 이야기 할 수 있습니다. 언어 구문의 관점에서 볼 때 언어에 C / C ++와 유사한 구문이 있다고 말할 수 있습니다.
  • 코딩 컨테스트를 조직하고 C 및 C ++로 작성된 솔루션을 모두 수락합니다.
  • 새 프로그래머를 고용하고 있으며 대부분의 작업은 C 또는 C ++이므로 프로그래머는 두 언어를 모두 알고 있어야합니다. 임베디드 개발에서는 일반적으로 C가 일부 (일반적으로 매우 작은) 마이크로 컨트롤러에 더 적합하고 C ++이 다른 마이크로 컨트롤러에 더 적합합니다. 이 경우 C / C ++ 프로그래머를 찾고 있다고 말할 수 있습니다.

10
나는 P.SO에 대한 일반적인 합의에 대한 입장을 본다. "애자일 / 과대 광고 / 유일하고 독특한 것"처럼 보이는 것을 공감하고 나머지는 공감해야합니다. 여러분, 프로그래밍은 종교가 아니며이 웹 사이트는 신성한 책이 아닙니다.

16
마지막 글 머리 실제로 큰 문제를 전시 : 당신이 찾고 계십니까 (1) 사람이 한 과학적 중 하나를 C 또는 C ++, (2) 알고있는 사람 모두 C와 C ++를 (3) 혼동하는 사람이이 듣고 다른 언어들. 세 번째 수영장이 자라는 것을 도와주지 마십시오.
5gon12eder

10
마지막 글 머리 기호는 "C와 C ++에 경험이있는 프로그래머"로 더 잘 표현 될 것입니다. 경험에 따라 "C 및 C ++"또는 "C 또는 C ++"라는 제목 목록이 필요한 "프로그래머"라는 제목의 광고는 "프로그래머"라는 제목의 제목과 "C / C ++"라는 필수 자격 요건과 크게 다르지 않습니다. 훨씬 더 정확합니다. 그러한 직업을 찾는 사람의 유형은 그 표현의 정확성을 매우 잘 알고있을 것입니다.
CVn

10
서면 언어에서 '/'는 일반적으로 논리적 or이 아니라 논리적으로 해석됩니다 xor. 하나 또는 둘 다입니다. 구인 목록에서는 C 또는 C ++ 또는 둘 다를 알고 있습니다. 이제 저는 많은 사람들이이 용어에 대해 종교적인 것처럼 느끼고 있습니다. 좋은 C 프로그래머는 독립적으로 어떻게 서로 다른 두 언어는 C ++를 따기 완벽하게 잘 될 것입니다. PHP 코딩을 시작한 다음 Scala (완전히 다른 두 가지 언어)로 옮겼습니다. 왜 C 프로그래머가 C ++을 선택할 수 없거나 그 반대일까요? C / C ++ 용어는 올바른 컨텍스트 내에서 사용되는 경우 장점이 있습니다.
ILikeTacos

4
C / C ++를 사용하여 C 또는 C ++로 컴파일 될 때 작동하도록 의도 된 프로그램이나 별도의 C 및 C ++ 구성 요소가있는 프로그램을 설명 할 수도 있습니다.
immibis 2016 년

30

일반적으로 SO 사용자는 질문을하는 사람에게 언어를 선택하도록 요청합니다 (C 또는 C ++). 왜?

C와 C ++ 사이에는 많은 미묘한 차이점이 있습니다. 예를 들어, C ++ const에서 전역 범위 의 변수는 선언되지 않은 경우 내부 연결을 extern갖지만 C에서는 선언되지 않은 경우 외부 연결을 갖습니다 static. OP는 "C / C ++"라고 말함으로써 질문에 대한 답변이 C와 C ++에서 동일하지 않다는 지식을 주장합니다. 이것은 불필요하게 응답자가 답하기 힘들게 만듭니다.

  • 때때로 우리는 코드가 한 언어 나 다른 언어에서는 유효하지 않다는 것을 알 수 있습니다 (예를 들어, void*포인터를 객체로 암시 적으로 변환 하는 것은 C ++에서는 유효하지 않습니다). 이것은 성가신 일입니다. C에서는 유효하지만 C ++에서는 유효하지 않은 코드가있을 때 왜 "C / C ++"라고 말합니까? C를 의도 했습니까? 아니면 C ++로 작성된 코드의 오류입니까?

  • 때로는 언어에 따라 대답이 다를 수 있습니다 (예 : 가변 길이 배열은 C99에는 있지만 C ++에는 없음). 우리가 당신이 말하는 언어를 모른다면, 실제로 사용하는 언어를 알고 있기 때문에, 실제로 유용한 언어 가 언제인지 추측하거나 답을 써야합니다 . 당신은 우리에게 말하지 않습니다!

  • 때로는 대답이 두 언어 모두에 대해 동일하지만 확실하지 않습니다. 예를 들어, C와 C ++는 동일한 정수 변환 규칙을 가지고 있다고 생각하지만 실제로 확실하게 두 표준을주의 깊게 읽어야합니다. 다시 말하지만, 언어 중 하나에 만 관심이있을 때 필요한 두 배의 작업을 수행하게합니다.

어쨌든 다른 질문에 대답하십시오.

  1. 예.

  2. C 및 C ++ 코드를 함께 연결하는 경우 두 태그를 모두 사용할 수 있지만 각 파일의 언어를 지정하십시오.

  3. 간혹 변경 사항이 있지만 드물고 일반적으로 영향이 제한적입니다 (그렇지 않으면 승인되지 않음). 예를 들어, autoC ++ 11에서.

  4. 나는 그들이 직접 협력한다고 생각하지는 않지만, 다른 언어로 된 개발에주의를 기울이고 호환성을 어렵게 만드는 변경을 피하려고 노력합니다.

그리고 두 언어에 대해 정말로 알고 싶다면 괜찮습니다. 질문에 그렇게 말할 수 있습니다. 당신이 "C / C ++"라고 말할 때, 나는 당신이 무엇을 의미하는지 잘 모르겠으며, 두 언어에 대해 가정하고있는 것처럼 보입니다.


7
C와 C ++의 교차점에서 코드를 작성하고 타입 검사에는 C ++ 컴파일러를 사용하지만 코드 생성에는 C 컴파일러를 사용하는 사람들이 있다는 것을 알고 있습니다. 그래도 실제로 의미가 있는지는 알 수 없습니다. 그러나, 리눅스 커널 메일 링리스트에 년의 각 한 쌍을 오는 주제는, 누군가가 (리눅스 커널의 통합 객체 지향 드라이버 모델에 매우 중요)이 이름을 변경하는 패치를 제출할 때 struct class처럼 뭔가를 struct klass정확히 이유를, 및 그런 다음 Linus에 의해 항상 격추됩니다.
Jörg W Mittag

3
@ JörgWMittag : "C / C ++"를 "C와 C ++의 공통 부분 집합"의 줄임말로 사용했던 사람을 만난 적이 없으며 그가 무슨 말을하는지 알고 있습니다. 공통 부분 집합에서 의도적으로 일하는 사람들은 약어를 사용하지 않고 명시 적으로 표현하는 경향이 있습니다.
Bart van Ingen Schenau

2
이것은 일반적으로가 아니라 Stack Exchange 질문 에 C / C ++ 사용하는 것에 대한 좋은 대답 입니다.
immibis 2016 년

@BartvanIngenSchenau 얼마나 많은 std위원회 회원을 만났습니까?
curiousguy

18

나는 항상 C가 C ++의 하위 집합이거나 C ++가 클래스가있는 C라고 들었습니다. 그리고 그것은 C ++ x0, C ++ 11 (또는 현대적인 C ++ 11/14/17)이 나타날 때까지 조용했습니다.

C는 C ++의 하위 집합이 아닙니다. 예를 들어 C89는 C ++ 98의 하위 집합이 아닙니다.

몇 가지 예 :

  • 함수 매개 변수 선언을위한 C89 식별자 목록 양식 은 C ++에서 지원되지 않습니다.
  • C89와 C ++ 98은 문자 상수에 대해 다른 유형을 가지고 있습니다
  • C89와 C ++ 98은 문자열 리터럴에 대해 다른 유형을 가지고 있습니다
  • 논리 연산자는 C89 및 C ++ 98에서 다른 유형을 생성합니다 ( intvs bool)
  1. C / C ++라는 용어 사용을 중단해야합니까?

예.

  1. # 1에 대한 대답이 예라면 C와 C ++를 혼합하여 사용하는 프로그램을 어떻게 호출합니까?

프로그램은 C 또는 C ++입니다 (일부 기본 프로그램이라도 C 또는 C ++ 컴파일러로 컴파일 할 수있는 경우). 어떤 컴파일러를 사용하여 컴파일합니까? 귀하의 질문에 대답해야합니다. Harbison & Steele은 Clean C 라는 용어를 만들어 C와 C ++의 공통 부분 집합을 지정했지만 잘못된 생각이라고 생각합니다.

편집 : 그러나 기술적으로는 단일 프로그램에서 C 및 C ++ 객체 파일을 링크 할 수 있지만 OTH는 단일 프로그램에서 혼합 될 수있는 많은 언어가 있습니다 (예 : Java 및 C ++). C / C ++ 프로그램이라는 용어를 사용하면 C / C ++이라는 단일 언어로 작성되었다는 혼동 만 추가 할 수 있다고 생각합니다.

  1. 둘 다 '다른'언어 인 경우 C ++ 컴파일러는 C 언어로 작성된 코드 지원을 중단 할 가능성이 있습니다 (현대 c ++은 포인터, 동적 메모리 처리 등과 같은 기본 사항에 대해 C 사고 방식에서 벗어나기 때문에)

_GenericC ++ 버전에서 지원하지 않는 C99 또는 C11의 많은 기능 (예 : 가변 길이 배열, 가변 배열 멤버 ,, ...)이 있습니다.


다국어 프로그램 재 : JNI를 광범위하게 사용하는 프로그램을 C / Java 프로그램이라고합니다. 두 언어가 함께 사용된다고해서 함께 컴파일되는 것은 아닙니다.
immibis

1
stroustrup.com/bs_faq.html#C-is-subset "엄격한 수학적인 의미에서 C는 C ++의 하위 집합이 아닙니다. 그러나 C ++은 C에서 지원하는 모든 프로그래밍 기술을 지원합니다. 몇 시간 만에 수만 줄의 C를 C 스타일 C ++로 변환 할 수 있으므로 C ++는 ANSI C가 K & R C의 수퍼 세트이고 ISO C ++이 C ++의 수퍼 세트 인 것처럼 ANSI C의 수퍼 세트입니다. 그것은 1985 년에 존재했던 .. 그럼 C는 법적 C ++ 또한 예를 들어, 커니 핸 및 리치의 모든 예 경향 작성 :. "C 프로그래밍 언어 (제 2 판)"는 C ++의 프로그램 또한 "
Ben

@ "C 프로그래밍 언어 (제 2 판)"의 첫 번째 프로그램 (hello world)은 C ++에서 유효하지 않은 main의 리턴 유형을 생략합니다.
ouah

1
@ouah, Stroustrup 교수는 다음 중 하나를 놓친 것 같습니다 :-) C11에서도 허용되지 않습니다.
Ben

4
@ouah, C ++의 첫 번째 버전이 아닙니다. 이 책은 1988 년 부터 작성되었으며 그 당시 어느 언어도 ISO 표준이 아니 었습니다. 당시 C ++의 현재 버전은 Bjarne Stroustrup의 1985 년 책이었습니다.
Ben

17

일부 프로그램은 C와 C ++의 혼합으로 작성됩니다

이것은 단지 인생의 사실입니다. C 및 C ++에서 오브젝트 파일을 컴파일하고 서로 링크 할 수 있습니다. 결과는 상당히 "C / C ++ 프로그램"이라고 할 수 있습니다.

그러나 그것은 전체 프로그램 일뿐입니다. 개별 편집 단위는 어떻습니까?

C의 하위 집합이 있으며 C의 하위 집합이기도합니다.

해당 서브 세트로 작성된 프로그램 (또는 컴파일 단위)은 적합한 C 및 C ++ 컴파일러에서 컴파일되고 동일하게 작동합니다. 이러한 프로그램이나 파일은 "C / C ++ 프로그램"또는 "C / C ++ 파일"이라고 할 수 있습니다.

헤더 파일과 같은 부분 프로그램도 C 및 C ++ 프로그램 모두에서 사용될 수 있습니다. 이러한 헤더 파일은 C / C ++ 헤더라고 할 수 있습니다.

인용 교수 Bjarne Stroustrup :

C는 C ++의 하위 집합입니까?

엄격한 수학적 의미에서 C는 C ++의 하위 집합이 아닙니다. 유효한 C이지만 유효한 C ++이 아닌 프로그램과 C와 C ++에서 다른 의미를 가진 코드를 작성하는 몇 가지 방법이 있습니다. 그러나 C ++는 C가 지원하는 모든 프로그래밍 기술을 지원합니다. 모든 C 프로그램은 C ++에서 동일한 런타임 및 공간 효율성으로 본질적으로 동일한 방식으로 작성 될 수 있습니다. 몇 시간 안에 수만 줄의 ANSI C를 C 스타일 C ++로 변환 할 수있는 것은 드문 일이 아닙니다. 따라서 C ++은 ANSI C가 K & R C의 수퍼 세트 인 것처럼, ISO C ++는 1985 년에 존재했던 C ++의 수퍼 세트 인만큼 ANSI C의 수퍼 세트입니다.

잘 작성된 C는 또한 합법적 인 C ++ 인 경향이 있습니다. 예를 들어, Kernighan & Ritchie의 모든 예제 : "C Programming Language (2nd Edition)"도 C ++ 프로그램입니다.

그래서 C / C ++와 같은 일이있다. 유효한 C와 유효한 C ++ 모두입니다.

C 프리 프로세서는 C 언어의 일부입니다. C ++ 전처리 기는 C ++ 언어의 일부입니다

C 또는 C ++에서 컴파일되고 다른 컴파일 단위를 작성할 수 있습니다 . 예를 들어 C로 컴파일 된 기본 기능이 있지만 C ++로 컴파일 된 경우 C ++ 라이브러리를 활용할 수 있습니다.

프로그램이 본질적으로 동일하지만 추가 기능 이있는 경우 동일한 프로그램이라고 말하는 것은 잘못 이 아닙니다 . 동일하지만 다릅니다.

대부분의 C 프로그래머는 최소한 작은 C ++을 할 수 있고 그 반대도 가능합니다

그런 사람을 C / C ++ 프로그래머라고 부를 수는 없습니다. 네, 아마 하나를 전문으로하지만, 할 수 없어 그대로 유능한 C 또는 C ++ 프로그래머 사람이 어떤 다른 언어는? 어떤면에서, 그들은 모두 C / C ++ 프로그래머가 아닌가?

"C / C ++"라고 말하는 데 아무런 문제가 없습니다. 중요한 것은 이해되고 있습니다

영어는 실로를 표현하는 도구가 아닙니다 . 당신은 할 수 있습니다 로직 영어를 사용하지만, 단지, 그리고 큰 노력과 함께.

단어는 자연스럽게 정확한 의미를 갖지 않고, 모호한 의미의 의미와 의미가 있기 때문입니다. 중요한 것은 사람들이 당신이 말하는 것을 이해한다면입니다.


5
@ BЈовић 그들은 작은 용어를 받아 들일 수 있다는 점에 동의하지 않기 때문에 차이점을 이해하지 못하고 무능하다는 결론을 내립니다. 그것은 꽤 불합리한 말입니다.
Ben

4
@ el.pescado 예. 사람들이 실제로 PHP / JavaScript를 참조한다는 것을 알게 될 것입니다. 왜 안돼? 요점은 단어로 게임을하는 것이 아니라 이해되어야한다.
Ben

10
@ BЈовић 당신은 말이되지 않습니다. "완전히 다른"것은 아닙니다. C ++는 C 보다 훨씬 더 큰 언어이지만 그 안에 거의 모든 C가 포함됩니다. C ++이 적절한 수퍼 세트 가되는 것을 막는 비 호환성이 있지만 추가 예약어와 같이 크기가 작기 때문에 캐스트가 더 필요하지만 그 정도면 충분합니다. 그것은는 거의 그냥 아주, 적절한 상위 집합.
Ben

7
@ BЈовић 아마도 내가 쓴 것을 이해하지 못했을 것입니다. 모든 경우에 C 프로그램이 C ++로 컴파일되도록 어떻게 적용 할 수 있는지 알아 보려면 여기를 보지 않겠습니까? david.tribble.com/text/cdiffs.htm#C99-vs-CPP9
Ben

7
@ BЈовић 용어에 대해 현명한 사람이라면 C가 " 기능적 "이 아니라 " 절차 적 "이라는 것을 알아야합니다.
RM

15
  1. C / C ++라는 용어 사용을 중단해야합니까?

물론. 용어를 사용하는 사람을 대신하여 C와 C ++가 무엇인지에 대한 혼란을 제외하고는이 구문이 무엇을 표현 하려는지 명확하지 않습니다.

이 혼란은 일반적인 좌절의 원천이기 때문에 많은 사람들이 그것에 대해 매우 감정적으로 변했고, 그 용어만으로도 당신의 기여에 대해 부정적이 될 수 있습니다. 이것은 어리석은 것처럼 보이지만 우리가 가진 것으로 보입니다.

“C / C ++”에 대해 말하는 대신 실제로 의미를 명확하게하는 용어를 사용하는 것이 좋습니다.

  • C ++에서 C ++에 해당 될 수도 있고 그렇지 않을 수도있는 것에 대해 이야기하고 있다면 간단히 C 라고 말하십시오 .

    예 : C에서 함수를 어떻게 main선언 해야 합니까?

    처음에는 C ++에 대한 대답은 동일 함을 보일 수 있습니다 : int main()int main(int, char**). 그러나 논의가 진행됨에 따라 C ++에서 함수는 전역 범위에서 선언되어야하며 C에는 의미가 없으므로 namespaces 가 없으므로 의미가 없습니다 . 반면에 C는 main재귀 호출을 허용 하지만 C ++에서는 재귀 호출을 허용 하지 않습니다. C ++에서는 return 0;“내려 가면” 암시 적이 main지만 C에서는 return모든 경로에 명령문이 필요합니다. 목록은 계속 진행되며 토론 할 언어가 무엇인지 먼저 밝히면 토론이 훨씬 간단 해집니다.

  • C ++에서 C에 해당하거나 사실이 아닌 것에 대해 이야기하고 있다면 간단히 C ++ 라고 말하십시오 .

    예 : s malloc()ed 배열은 intC ++에서 처음에는 모두 0입니까?

    C에 대한 짧은 대답은 동일합니다. 그러나 대답이 계속됨에 따라 C calloc에서 C ++에서 좋은 대안이 될 std::vector<int>수 있음을 지적하는 것이 좋습니다. 처음에는 a를 사용하는 것이 더 나은 선택이었습니다.

  • 당신은 C와 C ++ 사이의 유사성을 지적하고 싶은 경우에, 말 ++ C와 C를 .

    예 : C 및 C ++에서 sizeofan int은 구현이 정의되어 있으며 컴파일러와 아키텍처에 따라 다를 수 있습니다.

    여기서 우리는 C와 C ++가 같은 방식으로 작동한다는 것을 지적하고 싶습니다. 우리는 언어 에 대해 분명히 이야기하고 있습니다.

실제로는“C”또는“C ++”뿐만 아니라 정확한 버전에 대해 더 구체적으로 이야기하는 것이 좋습니다. 두 언어 모두 진화하고 있으며

C ++는 지원 /* … */하고 // …주석을 제공하지만 C는 /* … */스타일 만 지원합니다 .

옳고 그른 것도 아닙니다.

  1. # 1에 대한 대답이 예라면 C와 C ++를 혼합하여 사용하는 프로그램을 어떻게 호출합니까?

언어가 겹치므로 모든 C 프로그램에는 C ++처럼 보일 수 있는 부분 이 포함 되며 그 반대도 마찬가지입니다. 그럼에도 불구하고, 저자는 아마도 C 또는 C ++ 컴파일러를 사용하여 정착했을 것입니다. 따라서 C 컴파일러로 컴파일 된 경우 " 프로그램은 C 로 작성 됨"이라고 말하고 C ++ 컴파일러를 사용하는 경우에는 최신 C ++ 기능 사용을 거부하더라도 " 프로그램은 C ++ 로 작성됩니다 "라고 말하십시오. 어떤 사람들은 이러한 C ++ 코드를 C 스타일 C ++ 이라고 말합니다 . 오버로드, 예외, 다형성, 템플릿 및 I / O 스트림의 부재는 이러한 코드의 일반적인 특성입니다.

대신, 일부 파일은 C로 작성되고 컴파일 된 C 컴파일러와 일부 경우 다른 파일을 함께 링크 된 오브젝트 파일을 C ++로 작성 후, C ++ 컴파일러와 함께 컴파일, 나는 프로그램이 작성된 것입니다 "라는 말을 실제로 C와 C ++의 혼합 ”을 참조하십시오.

그러나 대신 작성자가 C 또는 C ++ 컴파일러 로 컴파일 할 수 있고 결과 프로그램이 동일한 작업을 수행 하는 방식으로 각 파일을 작성하는 데 각별한주의를 기울 였다면 다음과 같이 말할 수 있습니다. C와 C ++의 공통 부분 집합으로 작성되었습니다 .”

후자는 종종 C와 C ++ 코드간에 공유되어야하는 헤더 파일의 경우입니다. 그런데 그런 코드를 작성하는 것은 쉽지 않습니다. 당신이 더 그러한 구조는 C와 C ++에서 유효한지 사용 된 것을 강조하려는 경우 크게 다른 컴파일러 공급 업체 지원, 용어 휴대용 C와 C ++의 공통 부분 집합이 사용될 수있다 이것을 강조한다.

  1. 두 언어가 모두 "다른"언어 인 경우 C ++ 컴파일러가 C 언어로 작성된 코드 지원을 중단 할 가능성이 있습니까 (현대 C ++이 포인터, 동적 메모리 처리 등과 같은 기본 사항에 대해 C 사고 방식에서 벗어나기 때문에)?

이 질문을 이해하지 못했습니다. C와 C ++ 다른 언어이므로, 이들 중 하나에 대한 컴파일러가 다른 하나를 위해 작성된 프로그램을 승인 할 수는 없습니다. 그러나 컴파일러는 종종 모듈 방식으로 설계되며 컴파일러에 C ++ front-end 가 있으면 C 프런트 엔드도있을 가능성이 높습니다. 그런 다음 명령 행 스위치 또는 유사한 수단을 통해 원하는 언어를 선택할 수 있습니다. 두 언어가 널리 사용되는 한, 이것이 변경 될 가능성은 거의 없습니다. “현대 C ++”에 대한 당신의 요점은 기본적으로 좋은 코딩 표준과 표준 라이브러리의 문제라고 생각합니다. 로부터 컴파일러의 관점, 두 언어의 진화는 오히려 분기보다 수렴된다.

  1. 호환성을 유지하기 위해 C / C ++ 표준을 만드는 사람들 사이에 현재 협력 관계가 있습니까?

예. C ++ 11 및 C11에 도입 된 메모리 모델과 원자 연산 라이브러리가 좋은 예입니다. 두 언어의 디자이너는 호환성이 중요하다는 것을 인식하고이를 개선하기 위해 노력하고 있습니다. 개인적으로, 나는 협력이 더욱 강해졌고 두 ISO 실무 그룹이 합류하기를 원했지만 내 소원은 중요하지 않습니다.

Bjarne Stroustrup 은 아이러니하게도“C / C ++ 호환성”이라는 제목 의 C ++ 프로그래밍 언어 4 판 44.3의 44.3 버전에서 다양한 C 및 C ++ 버전의 차이점과 공통점에 대해 설명합니다 . 이 경우 용어의 의미가 분명하기 때문에이 용어를 사용하는 것이 적절할 수 있습니다.

  1. # 4가 맞다면, 그러한 협업은 현대 C ++ (11/14/17)의 등장으로 가까운 장래에 끝날 수 있습니다.

위에서 논의한 바와 같이, 그것은 C ++ 11에서 발생했으며 다시 일어날 것으로 기대 / 요망 / 필요합니다.


어떻게 옳고 그른 것도 될 수 없습니까?
JDługosz

4
“녹색 물건은 비싸다”는 진술과 마찬가지로 잘 정의 된 진실 가치는 없습니다. C와 C ++ 버전의 특정 조합에 대해서는 사실이며, 다른 경우에는 거짓입니다.
5gon12eder

5

C / C ++는 C와 C ++의 교차점입니다.

int new;C / C ++가 아니며 둘 다입니다 vector<int> foo;.

마찬가지로 C89 / C99는이 두 언어의 교차점으로, enum bool { false, true };또는 둘 다 for(int i = 0;;)허용 되지 않습니다.

그리고 C ++ 11 / C ++ 14 등

C ++ 11 및 C ++ 14에서 컴파일 (및 올바르게 실행)되는 코드를 작성할 수 있습니다. 한 코드에서 컴파일한다고해서 다른 코드에서 컴파일되는 것은 아닙니다. 실제로 많은 사람들이 이것을합니다.

그리고 많은 사람들이 C와 C ++에서 작동하는 코드를 작성합니다.

겹치는 부분이 클수록 더 의미가 있습니다. C / C ++ / Java 코드에 대한 질문이 없을 것으로 예상됩니다.


이러한 언어의 공통 부분 집합에 대해 이야기하는 것이 "이해가되지만"많은 질문에이 부분 집합에 대한 답변이 없을 것입니다 .

그러나 이러한 사양이 "버전"또는 "언어 이름"으로 구분되는지 여부에 관계없이 여러 언어 사양에 맞는 코드에 대해 이야기 할 수 있습니다.


3

이것은 다른 답변과 의견 중 일부에서 볼 수 있듯이 "이것은 금속과 가까이 일하고 관리 환경에서 괜찮은 프로그래머를위한 코드"라는 입장에 대한 반응입니다.


나는 그 해석조차도 조심스럽게 다루어야한다고 주장했다.

C ++ 프로그래머와 C 프로그래머로 자신을 묘사 한 사람을 원한다면 적어도 90 년대 중반부터 객체 지향 디자인에 대해 얼마나 많은 것을 알고 있는지, 객체에서 디버깅에 대한 경험이 얼마나 많은지 물어봐야했습니다 지향적 컨텍스트 및 템플릿 라이브러리 사용 능력에 대한 정보 인터뷰 및 채용 과정에서 이러한 문제를 정확하게 조사하고 싶을 것입니다.

반면에 C ++ 전문가들이 "현대 C ++"을 추진하기 시작한지 ​​이제 10 년 이상이 지났습니다. 즉, 베어 포인터에서 안전한 포인터 객체 및 반복자 기반 관용구로 이동하는 것을 강조합니다. C ++ 11의 등장으로 이제 멀티 패러다임 프로그래밍에 대한 명시적인 지원이 이루어졌으며 베어 포인터가없는 코드에 대한 푸시는 매우 강력합니다. 그 의미는 오늘 C ++ 프로그래머와 C 위치를 인터뷰하면이 사람이 실제 발 발사 가능 포인터에 얼마나 친숙한 지 확인하는 데 매우 관심이 있다는 것입니다.

나는 요즘 사업에 있지 않습니다 (스택 오버플로가 초기 단계에 있었을 때조차도). 그래서 가상 인터뷰 대상자가 크로스 오버 기술을 가지고 있지 않은 빈도에 대해서는 추측하지 않을 것입니다. 가장 자주 적용되는 언어는 실제로 매우 다르다고 생각합니다.

간단히 말해서 "C / C ++"는 기술적 인 상황뿐만 아니라 대부분의 비즈니스 상황에서도 삭제되어야합니다.


"알고있는 C 또는 C ++", "C와 C ++, 서로 연결됨", "C와 C ++, 교차점"또는 "C 또는 C ++, 관심있는 사람"이라는 의미의 모호함 어떻게 든 도망 갈 수있는 경우에도 점점 더 정당화 될 수 없습니다.
중복 제거기

2

이 질문에 대한 가장 간단한 대답은 해당 용어를 사용한 적이 없어야한다는 것 입니다. 존재하지 않아야하는 용어입니다. 의미가 없습니다. 모든 프로그램은 C 또는 C ++입니다.

그리고 그것은 C ++ x0, C ++ 11 (또는 현대적인 C ++ 11/14/17)이 나타날 때까지 조용했습니다.

C ++ 98과 03은 클래스가있는 원격 C조차 아닙니다. 누가 당신에게 이것을 가르쳤다는 것은 똥을 모르고 당신은 그들을 잊을 수 있습니다. 이것은 결코 정확하지 않았습니다.


이것은 전적으로 사실이 아닙니다. "C / C ++"라는 언어에 대해 제안 된 언어 사양을 설명하는 페이지가 있었는데, 그 중에서도 유형 시스템이 거의 없음을 명시한 페이지가있었습니다. 안타깝게도 그 페이지는 게시 중단되었으며, 그 페이지를 호스팅 한 사이트는 archive.org에서 보관 된 사본을 지우는 robots.txt를 작성했습니다.
greyfade

1
Aha, archive.is에서 사본을 찾았습니다 : Rationale , Syntax and Semantics .
greyfade

5
"모든 프로그램은 C 또는 C ++입니다." 동의하지 않습니다. C 프로그램을 가져 와서 한 번에 한 파일 씩 C ++로 포팅하는 것이 일반적 입니다 (해당 파일의 컴파일러 옵션을 변경하여). 일부 파일은 이식되지 않으며 C를 영원히 유지합니다. 이러한 프로그램은 C와 C ++로 작성되었습니다
nikie

실제로는 아닙니다. 이 프로그램은 서브 프로그램으로 구성되며 각 프로그램은 C 또는 C ++입니다. 컴파일러에 관한 한 전체 프로그램 인 각 TU는 C 또는 C ++로 컴파일됩니다.
DeadMG

3
"모든 프로그램이 C 또는 C ++"인 경우는 아닙니다. Bjarne Stroustrup 교수는 다음과 같이 말합니다. '글로 작성된 C는 합법적 인 C ++이기도합니다. 예를 들어 Kernighan & Ritchie의 모든 예제 : "C Programming Language (2nd Edition)"도 C ++ 프로그램입니다. ' stroustrup.com/bs_faq.html#C-is-subset
Ben

1

개념적으로 C 소스 파일을 디자인하는 데 특별한 어려움이 없어야 C ++로 그대로 컴파일 할 수 있습니다. 실제로이 작업을 수행하면 몇 가지 중요한 이점이 있습니다. 예를 들어, 임베디드 시스템 용 코드를 작성할 때 호스팅 된 PC 환경에서 코드를 테스트하는 것이 도움이되는 경우가 있습니다. 코드가 C ++로 깔끔하게 컴파일되면 "MOTOR_ENABLE = 1;"과 같은 문장을 가질 수 있습니다. 임베디드 시스템의 휘발성 I / O 비트에 쓰기 (C로 컴파일)하지만 PC에서 에뮬레이션 로직을 트리거합니다 (C ++로 컴파일). uint16_t가 더 작은 임베디드 시스템에서 작동하는 방식으로 작동하는 PC에서 C ++ 유형을 설계하는 것이 가능할 수도 있습니다 (예를 들어 u16 x=65533;컴파일러는 다음의 값을 고려해야합니다)x*x내 에뮬레이터 중 어느 것도 그것을 포함하지 않았지만 (내가 사용한 C ++ 컴파일러는 그러한 경우 엉뚱한 것을하지 않았기 때문에) 9 개로 원하는 것을 자유롭게 통치하지 않습니다.

불행히도, C 프로그래머와 C ++ 프로그래머는 언어가 서로 호환되는 방식으로 진화 해 온 서로에 대해 충분한 반감을 가지고 있습니다. C89가 C ++의 더 유용한 기능 (예 : 함수 프로토 타입)을 수정하려고 시도했지만 C ++의 기능 중 하나를 원하는 프로그래머는 C ++을 사용해야한다는 사실이 나타났습니다. C ++의 일부 기능 (예 : 필요하지 않은 다른 기능과 관련된 비용을 수용하지 않고도 정적 또는 정적 인라인 링크로 함수를 오버로드하는 기능) (예 : 내보내기와 관련된 이름 조작) 과부하 기능).

C89와 C ++ 98의 교차점은 실행 가능한 언어이지만, 이후 버전의 C와 이후 버전의 C ++의 사용 가능한 수퍼 세트는 아마도 엄격한 앨리어싱 규칙과 같은 것들 덕분에 성장하지 않고 줄어 들었을 것입니다. 균열이 증가합니다.


1
"C ++ 95"는 무엇입니까? 기술 보고서?
Ben Voigt

1
내부 함수에 과부하가 걸리고 외부 함수에 대해서는 이름을 다루지 않으려면 전자를 익명으로 namespace만들고 후자를로 선언 extern "C"한 다음 C ++ 컴파일러를 사용할 수 있습니다.
5gon12eder

@ BenVoigt : Mea Culpa. 나는 그것을 찾아야했다. C99 이전의 C ++ 버전. C89가 나왔을 때 C를 C ++처럼 만들려고했지만 C99는 C ++가 확실히 관심을 갖지 않은 많은 기능 (예 : 가변 길이 배열)을 추가했습니다. C ++로 많이 프로그래밍하지는 않지만 C ++ 기능 중 몇 가지가 C보다 다양한 기능이 C보다 도움이 될 것이라고 생각합니다.
supercat

@ 5gon12eder : C ++ 코드를 C 프로젝트에 연결하려고 시도한 적이 없습니다. 모든 것이 정적 / 인라인이거나 extern "C"다른 합병증이있는 것만 큼 ​​간단 합니까 (예 : 정적 객체 초기화 등)? C ++에서 매크로를 foo(1234)호출하고 [ 상수가 아닌 곳 ]이 함수 를 호출 할 수있는 방법이 있습니까? 임베디드 코드에는 포트와 상태가 둘 다인지 여부에 따라 세 가지 형태를 갖는 것과 같은 "기능"에 적합 할 수있는 많은 상황 이 있습니다.foo_const(1234)foo(x)xfoo_var(x)SET_PORT(port, state)
supercat

... 컴파일 타임 상수, 포트는 일정하지만 상태가 일정하지 않거나 포트 또는 상태가 상수가 아닌 곳. 템플릿이나 다른 표준 C ++ 메커니즘을 사용하여 깔끔하게 수행 할 수있는 방법이 있습니까, 아니면 gcc 확장자를 가진 컴파일러에서만 가능합니까?
supercat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.