C ++에서 구체적으로 예를 들어 다음과 같은 의미 론적 차이점은 무엇입니까?
static const int x = 0 ;
과
const int x = 0 ;
모두 static
링키지 및 스토리지 클래스 지정자 (즉, 내부 및 외부 기능) 등.
답변
파일 범위에서 C ++에는 차이가 없습니다. const
내부 연결을 기본값으로 만들고 모든 전역 변수는 정적 수명을 갖습니다. 그러나 첫 번째 변형은 C에서 동일한 동작을 가지므로이를 사용해야하는 좋은 이유가 될 수 있습니다.
함수 내에서 두 번째 버전은 매개 변수에서 계산할 수 있습니다. C 또는 C ++에서는 다른 언어와 같이 컴파일 타임 상수 일 필요는 없습니다.
클래스 내에서 기본적으로 함수와 동일합니다. ctor-initializer-listconst
에서 인스턴스 값을 계산할 수 있습니다 . A 는 시작 초기화 중에 설정되며 나머지 프로그램에서는 변경되지 않습니다. (참고 : 선언과 초기화가 분리되어 있기 때문에 멤버 코드 는 약간 다르게 보입니다.)static const
static
C에서 + +, 기억 const
수단이 읽기 전용 이 아닌 상수 . 포인터가 있으면 const
프로그램의 다른 부분이 보이지 않는 동안 값을 변경할 수 있습니다. 변수가로 정의 된 경우 const
초기화 후 아무도 변수 를 변경할 수 없지만 초기화는 여전히 복잡 할 수 있습니다.
답변
C ++ 17 표준 초안 은 파일 범위 에서 const
암시 static
합니다.
https://stackoverflow.com/a/3709257/895245 에서 언급 한 내용에 대한 인용문입니다.
C ++ 17 n4659 표준 초안 6.5 “프로그램 및 링크”:
3 네임 스페이스 범위 (6.3.6)를 가진 이름은 이름이
- (3.1) — 명시 적으로 정적으로 선언 된 변수, 함수 또는 함수 템플릿; 또는,
- (3.2) — 명시 적으로 extern으로 선언되지 않았거나 외부 연결을 갖도록 선언되지 않은 비 휘발성 const 한정 타입의 비 인라인 변수 또는
- (3.3) — 익명 공용체의 데이터 멤버.
부록 C (정보) 호환성, C.1.2 6 절 : “기본 개념”은 이것이 C에서 변경된 이유에 대한 근거를 제공한다.
6.5 [또한 10.1.7]
변경 : 명시 적으로 선언 된 const이고 명시 적으로 extern으로 선언되지 않은 파일 범위의 이름에는 내부 연결이 있지만 C에서는 외부 연결이 있습니다.
이론적 근거 : const 객체는 C ++로 변환하는 동안 값으로 사용될 수 있으므로이 기능을 사용하면 프로그래머가 각 const 객체에 대해 명시적인 초기화를 제공해야합니다. 이 기능을 통해 사용자는 const 객체를 둘 이상의 번역 단위에 포함 된 소스 파일에 넣을 수 있습니다.
원래 기능에 미치는 영향 : 잘 정의 된 기능의 의미로 변경합니다.
변환의 어려움 : 의미 론적 변환.
얼마나 널리 사용됩니까?
참조 : const가 C에없는 경우 const가 C ++의 내부 연결을 의미하는 이유는 무엇입니까?
헤더 대신 할 일
에서 자세히 설명 : 무엇 CONST 정적 ‘평균 C 및 C ++합니까?
- pre C ++ 17 :
extern
헤더, cpp 파일의 정의 - post C ++ 17 : 헤더의 인라인 변수