C 대 C ++의 상수 정확성
나는 const 정확성이 무엇을 의미하는지 이해하고 내 질문은 const 정확성이 무엇인지에 관한 것이 아닙니다. 그래서 나는 그것에 대한 설명이나 C ++-FAQ 링크를 기대하지 않습니다.
내 질문은 다음과 같습니다.
const
C와const
C ++ 의 의미 론적 차이점은 무엇입니까 ? 과- 그 차이의 이유는 무엇입니까?
차이점을 명확히하는 각 표준의 인용문이 있으면 좋을 것입니다.
저는 정기적으로 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 이외의 추가를 금지했습니다 . (즉 &p1
A를 할당 할 수 있습니다 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
'program tip' 카테고리의 다른 글
CSS 단위 테스트 (0) | 2020.12.26 |
---|---|
WSDL 파일에서 ASMX 웹 서비스 만들기 (0) | 2020.12.26 |
Typescript + React / Redux : 속성 'XXX'가 'IntrinsicAttributes & IntrinsicClassAttributes 유형에 없습니다. (0) | 2020.12.26 |
파이썬을위한 대화 형 그래프 라이브러리가 있습니까? (0) | 2020.12.26 |
프로그래밍 방식으로 스토리 보드를 사용하여 뷰 컨트롤러를 푸시하는 다른 방법 (0) | 2020.12.26 |