답변:
당신이 비교하는 경우 C89
에 C++
여기에 몇 가지 있습니다
int n;
int n; // ill-formed: n already defined
int a[1];
int (*ap)[] = &a; // ill-formed: a does not have type int[]
int b(a) int a; { } // ill-formed: grammar error
struct A { struct B { int a; } b; int c; };
struct B b; // ill-formed: b has incomplete type (*not* A::B)
auto a; // ill-formed: type-specifier missing
C99는 다른 많은 경우를 추가합니다.
// ill-formed: invalid syntax
void f(int p[static 100]) { }
// ill-formed: n is not a constant expression
int n = 1;
int an[n];
// ill-formed: fam has incomplete type
struct A { int a; int fam[]; };
// ill-formed: two names for one parameter?
void copy(int *restrict src, int *restrict dst);
typedef;
C에서는 합법적 인 TU이지만 C ++에서는 아닙니다.
auto a;
최신 C ++ 표준 개정에 유효합니다.
a
무엇입니까?
auto x;
최신 개정판에서는 유효하지 않지만 예를 들어 auto x = 0;
그렇습니다. 나는 처음에 약간 충격을 받았다 :)
C ++에도 새로운 키워드가 있습니다. 다음은 유효한 C 코드이지만 C ++에서 컴파일되지 않습니다.
int class = 1;
int private = 2;
int public = 3;
int virtual = 4;
많은 것들이 있습니다. 간단한 예입니다 (C가 C ++의 적절한 하위 집합이 아님을 증명하기에 충분해야합니다).
int* test = malloc(100 * sizeof(int));
C로 컴파일해야하지만 C ++에서는 컴파일하지 않아야합니다.
int*
.
void *
C에서 어떤 포인터 유형에도 할당 할 수 있는를 반환 하고 C ++는 다른 포인터 유형에 할당 할 수 없습니다.
당신이 선언하는 경우 C ++에서 struct
, union
또는 enum
, 그 이름은 예선없이 바로 액세스 할 수 있습니다 :
struct foo { ... };
foo x; // declare variable
C에서는 이렇게 선언 된 유형이 고유 한 네임 스페이스에 있기 때문에 작동하지 않습니다. 따라서 다음과 같이 작성해야합니다.
struct foo { ... };
struct foo x; // declare variable
의 존재에 주목 struct
번째 줄에 존재합니다. union
및 enum
(각 키워드 사용)에 대해 동일한 작업을 수행 하거나 typedef
트릭을 사용해야합니다 .
typedef struct { ... } foo;
foo x; // declare variable
결과적으로 C에서 동일한 이름을 가진 여러 유형의 다른 종류를 가질 수 있습니다.
struct foo { ... };
typedef enum { ... } foo;
struct foo x;
foo y;
그러나 C ++에서는 struct
이름 struct
을 참조 할 때마다 키워드 접두사를 붙일 수 있지만 네임 스페이스가 병합되므로 위의 C 스 니펫은 유효하지 않습니다. 반면에 C ++는 C typedef
에서 변경되지 않은 트릭을 사용할 수 있도록 해당 유형에 대한 유형과 typedef가 동일한 이름 (분명히 효과 없음)을 가질 수 있도록 특별히 예외를 만듭니다 .
struct
, union
및 enum
)가 동일한 네임 스페이스를 공유합니다. 더 좋은 예는 다음과 같습니다struct foo { ... }; typedef enum { ... } foo;
이것은 또한 사용중인 C의 종류에 따라 다릅니다. Stroustrup은 C ++를 1989 ANSI 및 1990 ISO 표준과 최대한 호환되도록 만들었으며 더 이상 호환되지 않게 만들었으며 1995 버전은 아무것도 변경하지 않았습니다. C위원회는 1999 년 표준과는 다소 다른 방향으로 갔고, C ++위원회는 일부 변경 사항에 맞추기 위해 다음 C ++ 표준 (아마 내년 정도)을 변경했습니다.
Stroustrup은 "The C ++ Programming Language", Special Edition의 부록 B.2 (일부 자료가 추가 된 3 판)에 C90 / C95와의 비 호환성을 나열합니다.
'a'
입니다 int
C에서, char
C ++에서이.
열거 형의 크기는 int
C로되어 있으며 반드시 C ++로되어 있지는 않습니다.
C ++에는 //
줄 끝에 주석이 있지만 C 에는 주석이 없습니다 (일반적인 확장 임에도 불구하고).
C ++에서는 struct foo {
정의가 foo
전역 네임 스페이스에 배치되고 C에서는 struct foo
. 이렇게하면 struct
정의가 외부 범위의 이름을 숨기고 몇 가지 다른 결과가 발생합니다. 또한 C는 struct
정의에 대해 더 큰 범위를 허용하고 반환 유형 및 인수 유형 선언에서 허용합니다.
C ++는 일반적으로 유형에 대해 까다 롭습니다. 그것은 정수가 할당되는 것을 허용하지 않습니다 enum
, 그리고 void *
개체를 캐스팅없이 다른 포인터 타입에 할당 할 수 없습니다. C에서는 너무 큰 이니셜 라이저를 제공 할 수 있습니다 ( char name[5] = "David"
여기서 C는 후행 널 문자를 버립니다).
C89 int
는 많은 컨텍스트에서 암시 적 으로 허용되었지만 C ++는 그렇지 않습니다. 즉, 모든 함수는 C ++로 선언해야하지만 C89 int
에서는 함수 선언에 적용 할 수있는 모든 것을 가정하여 얻을 수있는 경우가 많습니다 .
C에서는 레이블이 지정된 명령문을 사용하여 블록 외부에서 내부로 이동할 수 있습니다. C ++에서는 초기화를 건너 뛰면 허용되지 않습니다.
C는 외부 연결에서 더 자유 롭습니다. C에서 전역 const
변수는 암시 적 extern
으로이며 C ++에서는 사실이 아닙니다. C를 사용하면 전역 데이터 개체를.없이 여러 번 선언 할 수 extern
있지만 C ++에서는 그렇지 않습니다.
많은 C ++ 키워드는 C의 키워드가 아니거나 #define
표준 C 헤더의 d입니다.
더 이상 좋은 스타일로 간주되지 않는 C의 오래된 기능도 있습니다. C에서는 인수 목록 뒤에 인수 정의가있는 함수를 선언 할 수 있습니다. C에서 다음과 같은 선언 은 임의의 수의 인수 유형을 취할 수 int foo()
있음을 의미 foo()
하지만 C ++에서는 int foo(void)
.
Stroustrup의 모든 것을 다루는 것 같습니다.
내가 생각하는 가장 큰 차이점은 이것이 유효한 C 소스 파일이라는 것입니다.
int main()
{
foo();
}
나는 foo
어디에도 선언하지 않았습니다 .
언어 차이 외에도 C ++는 C에서 상속 된 라이브러리를 일부 변경합니다. 예를 들어 일부 함수 const char *
는 char *
.
s,C,C89,
파일은 유효하지 않은 C99 소스 파일입니다.
#include <stdio.h>
int new (int n) {
return n/2;
}
int main(void) {
printf("%d\n", new(10));
return 0;
}
C ++ FAQ 항목을 참조하십시오 .
여기에 나와있는 여러 답변은 C89 (또는 C99) 소스 코드에서 C ++ 컴파일러가 실패하는 구문 차이를 다룹니다. 그러나 두 언어 모두에서 합법적이지만 다른 동작을 생성하는 미묘한 언어 차이가 있습니다. sizeof (char)
나빈이 언급 한 차이점은 하나의 예이지만, (ANSI) C 프로그램으로 컴파일 된 경우 "C"를 인쇄합니다 프로그램 및 "C ++"는 C ++ 프로그램으로 컴파일 된 경우 쓰기 목록 일부 다른 사람을.
구문만으로 언어를 비교할 수 없습니다. 그렇게하면 C를 C ++의 하위 집합으로 볼 수 있습니다. 제 생각에는 C ++가 OO (그리고 C는 아닙니다)라는 사실은 C와 C ++가 다른 언어라고 말하기에 충분합니다.