C의 const 한정자와 C ++의 const 한정자는 어떻게 다릅니 까?


9

사용자 R의견 을 찾았습니다 . :

C와 C ++는 같은 언어가 아닙니다. 특히 C const는 C ++과 관련이 없습니다 const.

constC의 const한정자와 C ++ 의 한정자의 차이점은 기본 연결 이라는 것을 알고 있습니다.

constC ++에서 한정자를 사용 하여 네임 스페이스 범위에서 선언 된 객체 에는 내부 연결이 있고 C에서는 const전역 범위에서 선언 된 한정자가 있는 객체 ( static앞에 한정자가 없는 const)에 외부 연결이 있습니다.

그러나 C 언어와 C ++ 언어는 어떻게 다른가요? 저는 두 언어 모두에서 같은 개념과 목적을 가지고 있다고 생각했습니다.

내 질문:

  • C의 const 한정자와 C ++의 const 한정자는 어떻게 다릅니 까?

에 대한 답변 "CONST"를 수행하는 방법은 C와 C ++에서 차이가? 한정자 의 맥락에서 C 언어와 C ++ 언어 사이 의 정확한 차이점을 지적하지 마십시오 const. 특정 언어로 할 수 없거나 할 수있는 것만.


Google 검색만으로도 많은 답변을 얻을 수 있습니다. 그들 중 하나 : stackoverflow.com/questions/4486442/…
Schaiba

1
C에서는 const연계와 관련이 없습니다. static const파일 범위에서 사용할 수 있으며 내부 연결이 있습니다.
Lundin

3
해당 질문에 대한 현재 답변이 마음에 들지 않으면 현상금을 게시하십시오.
Sneftel

3
연결된 복제본이 나쁘다는 데 동의합니다. 좋은 대답은 모든 차이점을 나열 하고const 두 언어에서 동일한 기능을 설명 하지는 않습니다.
Lundin

1
나는 그런 대답을 쓰려고 노력할 수 있지만 모든 차이점을 다룰 수있는 C ++ 전문가는 충분하지 않습니다. C ++의 const 변수는 C와 달리 상수 표현식입니다. C ++은 멤버 함수를 한정 할 수 있습니다. 언급 된 연계. 다른 거있어?
Lundin

답변:


11
  • 가장 중요한 차이점은 C ++에서 const변수는 상수 식 (C ++ 11 도입 이전에도 constexpr)이지만 constC 의 변수는 그렇지 않다는 것입니다.

    C ++은 const size_t n = 1; static int array[n];역사적인 이유로 C 와 같은 일을 할 수 있지만 C는 할 수 없다는 것을 의미합니다.

  • C ++ const에서 연계 결정에 참여합니다. 이것은 C ++ 버전마다 다릅니다. cppreference.com (강조 광산) 에 따르면 :

    네임 스페이스 범위에서 선언 된 다음 이름은 내부 연결을 갖습니다.


    • 비 휘발성 비 템플릿 (C ++ 14부터) 비 인라인 (C ++ 17부터) 비내 보낸 (C ++ 20부터) const 한정 변수 (constexpr 포함) extern으로 선언되지 않은 t 이전에 외부 연계가 있다고 선언;

    C에서는 const링크를 결정하는 데 전혀 관여 하지 않으며 선언 범위와 스토리지 클래스 지정자 만 중요합니다.

  • C ++에서는 const멤버 함수를 규정 할 수 있습니다 . 멤버 함수에 대한 구문 지원이 없으므로 C에서는 불가능합니다.

  • C를 사용 const하면 초기화 프로그램없이 -qualified 변수를 선언 할 수 있습니다. C에서는 const int x;초기화없이 쓸 수 있지만 C ++에서는 허용하지 않습니다. 한눈에, 이것은 C에서 의미없는 언어 버그처럼 보일 수 있지만, 이론적으로 컴퓨터에는 소프트웨어가 아닌 하드웨어에 의해 설정된 값을 가진 읽기 전용 하드웨어 레지스터가 있습니다. C가 하드웨어 관련 프로그래밍에 적합하다는 것을 의미합니다.


C에서 멤버 함수를 가질 수 있습니까?
Maxim Egorushkin

1
참고 const size_t n = 1; static int array[n];컴파일러의 정의를 볼 수있는 경우에만 작동 n하고 일정한 전파을한다. extern const size_t n; static int array[n];작동하지 않습니다.
Maxim Egorushkin

흠, 나는 오히려 그런 하드웨어 레지스터가 포인터 같은 것을 통해 해결되는 것을 본다 uint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);.
Aconcagua

@Aconcagua 그러면 그러한 레지스터는 나머지 레지스터 맵과 호환되지 않습니다. 그러면 어떻게 디버거에서 실제 레지스터 값을 볼 수 있습니까? 예를 들어, 읽기 전용 실리콘 마스크 세트 레지스터를보고 싶은 부분을 빨리 보려면 그리고 분명히, 당신은 또한 volatile포인터 를 규정 해야합니다.
Lundin

@Lundin은 인정했다, volatile...에 주의를 기울이지 않았다 ... 휴식은 달려있다. 이 경우 내가 직접 가지고 있던 디버거도 쉽게 해결할 수 있습니다 *x. 반면에 레지스터가 일부 메모리 영역에 매핑되고 컴파일러가 특정 메모리 위치에 변수를 직접 배치하는 것을 지원하지 않는 경우 (두 가지를 보았습니다) 특정 메모리 위치에 변수를 가져 오는 것이 때때로 약간 지저분해질 수 있습니다 (지도 파일에서 다루는 중 ...). 결국 나는 내가 맡은 임무를 수행 할 수있는 한 올바른 장소 나 포인터에 변수를 두는 것에 대해 신경 쓰지 않는다.;)
Aconcagua

0

에서 cppreference.com :

const비 로컬 비 휘발성 비 템플릿의 선언에 규정 사용 비 인라인 선언되지 않은 (C ++ 17 이후) 변수 (C ++ 보낸 14) extern를 내부 결합 준다. 이것은 const파일 범위 변수에 외부 연결이 있는 C와 다릅니다 .

그 외에는 constC 및 C ++에서 동일한 의미를 가지며 C 헤더 const는 종종 조건부 C ++ 헤더로 컴파일됩니다 "extern C".


1
잘못된 인용, 지나치게 단순화 한 것입니다. static const x;C의 파일 범위에는 내부 연결이 있습니다. C 변수의 연결은 선언 된 범위와 스토리지 클래스 지정자의 유무에 따라 결정됩니다. const다른 형식 한정자는 그 일부를 전혀 재생하지 않습니다.
Lundin

@ 룬딘 인용문과 다른 점은 무엇입니까?
Maxim Egorushkin

1
방금 제시 한 예는 인용이 잘못되었음을 증명합니다. 인용문에 따르면 static const x;C의 파일 범위에는 외부 연결이 있습니다.
Lundin

@Lundin이 인용문은 int const x = 1C에서 외부 연결 이 있다고 말합니다 . 따라서 static연결을 내부로 변경 해야 합니다. 귀하의 의견과 달리 견적은 매우 분명합니다.
Maxim Egorushkin

1
그것은 실제로 그렇게 말하지 않습니다. 인용문을 읽으십시오. "... C const 파일 범위 변수에 외부 연결이있는 경우"
Lundin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.