C는 C++의 서브셋이 아닐까요?
나는 많은 책에서 C가 C++의 부분집합이라고 읽는다.
일부 책에서는 C가 C++의 서브셋이라고 합니다만, 자세한 것은 제외합니다.
코드가 C++로 컴파일되지만 C++로 컴파일되지 않는 경우는 무엇입니까?
★★★★★★★★★★★★★★★를 비교하면,C89
C++
여기 몇 .
C++에 임시 정의가 없습니다.
int n;
int n; // ill-formed: n already defined
int[]와 int[N]가 호환되지 않습니다(C++에는 호환되는 유형이 없습니다).
int a[1];
int (*ap)[] = &a; // ill-formed: a does not have type int[]
K&R 함수 정의 스타일 없음
int b(a) int a; { } // ill-formed: grammar error
중첩된 구조의 클래스 범위가 C++입니다.
struct A { struct B { int a; } b; int c; };
struct B b; // ill-formed: b has incomplete type (*not* A::B)
디폴트 int 없음
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);
식식사는,sizeof('a')
sizeof(int)
.
에서는 C++입니다.sizeof('a')
sizeof(char)
.
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로 컴파일해야 합니다.
이것은 사용하고 있는 C의 종류에 따라서도 다릅니다.Strustrup은 C++를 1989년 ANSI 및 1990년 ISO 표준과 가능한 한 호환되도록 만들었고 1995년 버전은 아무것도 변경하지 않았습니다.C위원회는 1999년 기준과는 다소 다른 방향으로 진행되었으며, C++ 위원회는 일부 변경에 따라 다음 C++ 기준(아마 내년쯤 출시될 것)을 변경했습니다.
Strustrup은 "C++ 프로그래밍 언어" 스페셜 에디션 부록 B.2에 C90/C95와의 비호환성을 나열합니다(일부 추가 자료 포함 제3판).
'a'
는 입니다.int
C' 'C' 'A'char
C++라고 하다.
는 거형음음 음음 음음 음음 음 the the the the the the the the the the the 。int
C++로 하다
에는 C++가 있습니다.//
C는 (공통 내선번호이지만) 행의 끝에 코멘트를 붙이지 않습니다.
C에서는, C++는,struct foo {
에서는 「」를 지정합니다.foo
네임스페이스로 , 에서는 「C」라고 필요가 .struct foo
하면 " " " 가 됩니다.struct
외부 범위에서 이름을 음영으로 표시하기 위한 정의 및 기타 몇 가지 결과가 있습니다.C는 ,, 를, 다의 범위를 넓힐 수 .struct
및 .return type "type "declarnations" 에서 정의합니다
C++로 하다할 수 됩니다.enum
, , , , 입니다.void *
오브젝트는 캐스트 없이 다른 포인터 유형에 할당할 수 없습니다.C에서는 큰 이니셜라이저를 제공할 수 있습니다.char name[5] = "David"
여기서 C는 말미의 늘 문자를 폐기합니다).
는 암묵적인 C89를 했습니다.int
C++로 하다, 는 C, 의 경우 C++로 가정하여 할 수 .int
함수 선언에 해당하는 모든 항목에 대해 설명합니다.
C에서는 라벨이 붙은 문을 사용하여 블록 외부에서 내부로 점프할 수 있습니다.C++ 에서는, 초기화를 건너뛰면, 이것은 허가되지 않습니다.
C는 외부 링크에서 더 자유롭다. C' 'C'const
으로 「」입니다.extern
C++라고 하다.C를 를 여러 번할 수 . C는 글로벌 데이터 개체를 선언할 수 있습니다.extern
C++라고 하다.
C++ C++의 키워드가 됩니다.#define
C headers.d는 표준 Cheaders.d입니다.
또한 C의 오래된 특징들은 더 이상 좋은 스타일로 여겨지지 않는다.C에서는 인수 목록 뒤에 인수 정의를 사용하여 함수를 선언할 수 있습니다.C라고 하는 입니다.int foo()
foo()
++로 하면 C++로 C++로 할 수 있다.int foo(void)
.
Stroustrup의 모든 것을 커버하는 것 같습니다
gcc를 할 수 .-Wc++-compat
C++로 하다현재 gcc 자체에서 사용되고 있으며, 최근 많이 개선되었습니다(최선을 얻기 위해 야간 버전을 시도해 보십시오).
(이것은 엄밀하게 질문에 대한 답은 아니지만, 사람들은 그것을 좋아할 것이다.)
에서는 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를 붙일 수 있지만, C++에서는 프리픽스를 수 .struct
가 「」인 .struct
참조할 때마다 네임스페이스가 병합되므로 위의 C 스니펫은 유효하지 않습니다. C에서는, 그이 같은 없음)을 수 , 「」, 「C++」, 「C++」, 「C+」를 사용할 수 .typedef
C c 、 C c 、 C c c c c 。
여기에서는 C++ 컴파일러가 C89(또는 C99) 소스 코드에서 실패하는 원인이 되는 구문 차이에 대해 설명합니다.하지만, 두 언어 모두 합법적이지만 다른 행동을 일으킬 수 있는 미묘한 언어 차이가 있습니다.sizeof (char)
Naveen이 언급한 차이가 하나의 예이지만, (ANSI) C 프로그램으로 컴파일되면 "C"를 출력하는 프로그램과 C++ 프로그램으로 컴파일되면 "C++"를 출력하는 프로그램을 작성하십시오.
가장 큰 차이는 이것이 유효한 C 소스 파일이라는 것입니다.
int main()
{
foo();
}
, 아직 선언하지 .foo
아무 곳이나.
에도 C를 들어 는 C++ C를 반환합니다. 이치const char *
char *
.
C 컴파일러는 일반적으로 C++가 할 수 없는 작은 코너 컷을 허용합니다.C++는 C보다 훨씬 더 엄격하다.그리고 일반적으로 이러한 차이 중 일부는 컴파일러에 의존합니다.예를 들어 g++는 인텔 C++ 컴파일러가 지원하지 않는 것을 허용합니다.꽤 잘 작성된 C 코드도 최신 C++ 컴파일러로는 컴파일 할 수 없습니다.
#include <stdio.h>
int new (int n) {
return n/2;
}
int main(void) {
printf("%d\n", new(10));
return 0;
}
구문만으로 언어를 비교할 수 없습니다.이렇게 하면 C를 C++의 서브셋으로 볼 수 있습니다.제 생각에는 C++가 OO(C는 아니다)인 것만으로 C와 C++는 다른 언어입니다.
언급URL : https://stackoverflow.com/questions/1201593/where-is-c-not-a-subset-of-c
'programing' 카테고리의 다른 글
vue-material 구성 요소의 임의 로드 오류 (0) | 2022.06.12 |
---|---|
Vuex: 알 수 없는 변환 유형: 드롭다운 상태 (0) | 2022.06.12 |
Vue 라이프 사이클 리스너를 동적으로 추가하는 방법 (0) | 2022.06.12 |
사용자 편집 가능한 Vue 템플릿 (0) | 2022.06.12 |
java.util.stream에서 목록 가져오기Java 8에서의 스트림 (0) | 2022.06.12 |