programing

C는 C++의 서브셋이 아닐까요?

prostudy 2022. 6. 12. 11:58
반응형

C는 C++의 서브셋이 아닐까요?

나는 많은 책에서 C가 C++의 부분집합이라고 읽는다.

일부 책에서는 C가 C++의 서브셋이라고 합니다만, 자세한 것은 제외합니다.

코드가 C++로 컴파일되지만 C++로 컴파일되지 않는 경우는 무엇입니까?

★★★★★★★★★★★★★★★를 비교하면,C89C++ 여기 몇 .

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'는 입니다.intC' 'C' 'A'charC++라고 하다.

는 거형음음 음음 음음 음음 음 the the the the the the the the the the the 。intC++로 하다

에는 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를 했습니다.intC++로 하다, 는 C, 의 경우 C++로 가정하여 할 수 .int함수 선언에 해당하는 모든 항목에 대해 설명합니다.

C에서는 라벨이 붙은 문을 사용하여 블록 외부에서 내부로 점프할 수 있습니다.C++ 에서는, 초기화를 건너뛰면, 이것은 허가되지 않습니다.

C는 외부 링크에서 더 자유롭다. C' 'C'const으로 「」입니다.externC++라고 하다.C를 를 여러 번할 수 . C는 글로벌 데이터 개체를 선언할 수 있습니다.externC++라고 하다.

C++ C++의 키워드가 됩니다.#defineC headers.d는 표준 Cheaders.d입니다.

또한 C의 오래된 특징들은 더 이상 좋은 스타일로 여겨지지 않는다.C에서는 인수 목록 뒤에 인수 정의를 사용하여 함수를 선언할 수 있습니다.C라고 하는 입니다.int foo() foo()++로 하면 C++로 C++로 할 수 있다.int foo(void).

Stroustrup의 모든 것을 커버하는 것 같습니다

gcc를 할 수 .-Wc++-compatC++로 하다현재 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+」를 사용할 수 .typedefC 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++ FAQ 엔트리를 참조해 주세요.

구문만으로 언어를 비교할 수 없습니다.이렇게 하면 C를 C++의 서브셋으로 볼 수 있습니다.제 생각에는 C++가 OO(C는 아니다)인 것만으로 C와 C++는 다른 언어입니다.

언급URL : https://stackoverflow.com/questions/1201593/where-is-c-not-a-subset-of-c

반응형