program tip

C 대 C ++의 상수 정확성

radiobox 2020. 12. 26. 09:51
반응형

C 대 C ++의 상수 정확성


나는 const 정확성이 무엇을 의미하는지 이해하고 내 질문은 const 정확성이 무엇인지에 관한 것이 아닙니다. 그래서 나는 그것에 대한 설명이나 C ++-FAQ 링크를 기대하지 않습니다.

내 질문은 다음과 같습니다.

  • constC와 constC ++ 의 의미 론적 차이점은 무엇입니까 ?
  • 그 차이의 이유는 무엇입니까?

차이점을 명확히하는 각 표준의 인용문이 있으면 좋을 것입니다.

저는 정기적으로 C와 C ++ 사이를 전환하며 그렇게하는 동안 명심해야 할 중요한 사항을 알고 싶습니다.

그 이유를 기억하지 못하는 것 같지만 (추론을 해주실 수 있다면 특별한 감사를드립니다) 제 생각에는 다음과 같은 것이 기억납니다.

  • C ++의 const 변수에는 기본적으로 내부 연결이있는 반면 C에서는 기본 외부 연결이 있습니다.
  • const 객체는 C ++에서 컴파일 타임 값으로 사용할 수 있지만 C에서는 컴파일 타임 값으로 사용할 수 없습니다.
  • 문자열 리터럴에 대한 포인터 char const*는 C ++에서는 이어야 하지만 C에서는 char*.

내가 무엇을 놓치고 있습니까?


인용 한 차이점과 Steve Jessop이 언급 한 라이브러리 차이점 외에도

char* p1;
char const* const* p2 = &p1;

C ++에서는 합법적이지만 C에서는 허용되지 않습니다. 역사적으로 이것은 C가 원래 허용했기 때문입니다.

char* p1;
char const** p2 = &p1;

표준이 채택되었다 직전에, 누군가가 (이후이 CONST 안전에 구멍을 천공 것을 깨달았다 *p2지금을 할당 할 수 있습니다 char const*에서 어떤 결과 p1할당중인 char const*); 문제를 심도있게 분석 할 실시간이 없었기 때문에 C위원회는 const최상위 const 이외의 추가를 금지했습니다 . (즉 &p1A를 할당 할 수 있습니다 char **또는 char **const아니지만로 char const**도 아니고 char const* const*는 C ++위원회는 문제가 경우에만 존재 것을 깨달았다 추가적인 분석했다.) const레벨이 비 뒤를이었다 const레벨을하고 필요한 표현을했다 . (표준의 §4.4 / 4 참조)


C const선언 에서는 상수 표현식을 생성하지 않습니다. 즉, C const int에서는 케이스 레이블 객체를 비트 필드 너비 또는 비 VLA 배열 선언의 배열 크기로 사용할 수 없습니다 (이 모든 것은 C ++에서 가능합니다). 또한 const 객체는 기본적으로 C에서 외부 연결을 갖습니다 (C ++의 내부 연결). C ++ 언어의 상수 정확성 규칙은 다음 표준 변환을 지원합니다.

int **pp = 0;
const int *const *cpp = pp; // OK in C++

int ***ppp = 0;
int *const *const *cppp = ppp; // OK in C++

이들은 c에서 작동하지 않습니다.


이러한 차이점 중 일부는 Bjarne의 초기 설계 목표 중 하나였던 전 처리기 매크로를 제거 할 수 있기 때문입니다.

C에서 우리는

 #define MAX_FOOS 10
 int foos[MAX_FOOS];

C ++에서는 다음과 같이 작성할 수 있습니다.

 const int max_foos = 10;
 int foos[max_foos];

작동 max_foos하려면 상수 표현으로 사용할 수 있어야합니다. 또한 내부 연결이 필요하므로 정의가 여러 정의 오류를 일으키지 않고 헤더에 나타날 수 있으며 더 중요한 것은 컴파일러가 max_foos.

C위원회가 C ++에서 const를 채택했을 때 매크로에 대한 반감을 채택하지 않았기 때문에 이러한 의미가 필요하지 않았습니다.

참조 URL : https://stackoverflow.com/questions/8908071/const-correctness-in-c-vs-c

반응형