정적 const와 const의 차이점은 무엇입니까?


84

static const과 의 차이점은 무엇입니까 const? 예를 들면 :

그들 사이에 어떤 차이가 있습니까? 언제 다른 것을 사용 하시겠습니까?



5
재 개설에 투표했습니다. "중복"은 메모리 사용량에 따라 완전히 다른 질문을 던집니다. 이 질문은 차이점에 대한보다 일반적인 질문을합니다.
rmaddy

답변:


58

차이점은 연결입니다.

경우 i객체가 정의 된 변환 단위 외부에서 사용하지 않는, 당신은 그것을 선언해야 static지정.

이를 통해 컴파일러는 (잠재적으로) 추가 최적화를 수행하고 객체가 번역 단위 외부에서 사용되지 않음을 독자에게 알립니다.


8
+1 이러한 선언이 함수 내에있는 경우 의미를 추가 할 수도 있다면 좋을 것입니다.
Praetorian

const int i = 5;외부 연결 이 확실합니까 ?? C ++에서는 그렇지 않습니다 ...
Kerrek SB

4
파일 범위의 @KerrekSB, 예. (C99, 6.2.2p5) "객체에 대한 식별자 선언에 파일 범위가 있고 저장소 클래스 지정자가없는 경우 해당 연결은 외부입니다."
ouah

13
@KerrekSB : C와 C ++는 같은 언어가 아닙니다. 특히 C const는 C ++와 관련이 없습니다 const.
R .. GitHub STOP HELPING ICE

컴파일러는 실제로 정적을 기반으로 최적화합니까? 정적 객체가 번역 단위 외부에서 사용되지 않는다고 가정하는 것은 안전하지 않은 것 같습니다. 이는 여전히 비 정적 함수에 의해 전달되거나 비 정적 전역 포인터가 가리킬 수 있기 때문입니다.
nw.

99

static함수 외부의 가시성 또는 내부 변수 수명을 결정합니다. 그래서 그것은 const그 자체로 관련이 없습니다 .

const 초기화 된 후 값을 변경하지 않음을 의미합니다.

static 함수 내부는 함수가 종료되기 전후에 변수가 존재 함을 의미합니다.

static기능 외부는 표시된 기호의 범위 static가 해당 .c 파일로 제한되며 외부에서 볼 수 없음을 의미합니다.

기술적으로 (이를 조회하려는 경우) static는 스토리지 지정자이며 const유형 한정자입니다.


0

const int i = 5;
i가 정의되고 로컬로 선언 된 경우 포인터를 사용하여 수정할 수있는 i 값 const int a = 5; 또는 const int i = 5; 전역 적으로는 데이터 세그먼트의 RO 메모리에 저장되므로 수정할 수 없습니다.


-1

이러한 정의가 함수 내부에 있는지 여부에 따라 다릅니다. 함수 밖의 경우에 대한 답은 위의 ouah에 의해 제공됩니다. 함수 내부 에서 효과는 다릅니다. 아래 예에서 볼 수 있습니다.

지역 변수가 "정말 상수"가 되려면 "const"뿐만 아니라 "static const"를 정의해야합니다.


그것은 나를 위해 완벽하게 컴파일됩니다 ...하지만이 경우 정적 const 변수를 갖는 것이 어리 석다는 것을 알고 있습니다.
DrumM

1
@DrumM 그것은 바보가 아닙니다. 의 경우에는 foo가변 재 초기화마다가 my_function()할당되는 임의의 다른 값의 결과라고한다. bar한 번만 초기화 된 변수 의 경우 처음으로 my_function()호출되어 프로그램 수명 동안 동일한 값이 할당됩니다. 따라서 정적 저장 기간.
jb

1
사실, 더 깊이 생각해 보면 C 또는 C ++를 사용하는지에 따라 다릅니다. 질문은 C 태그가 지정됩니다.이 경우 컴파일 타임 상수 barrand()아니기 때문에 할당에 대한 컴파일 오류가 발생합니다 .
jb 19-06-12

1
@nibot은 스토리지 사양 및 유형 제한과 관련하여 "효과가 다르다"와 "정말로 일정하다"는 의미를 명확히 할 수 있습니까?
jb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.