정적 키워드 지원 중단… 더 이상?


89

C ++에서는 static번역 단위 내 에서 키워드 를 사용하여 심볼의 가시성 (변수 또는 함수 선언)에 영향을 미칠 수 있습니다.

n3092에서는 더 이상 사용되지 않습니다.

Annex D.2 [depr.static]
네임 스페이스 범위에서 객체를 선언 할 때 static 키워드 사용은 더 이상 사용되지 않습니다 (3.3.6 참조).

n3225에서는이 기능이 제거되었습니다.

내가 찾을 수있는 유일한 기사는 다소 비공식적입니다.

그러나 C와의 호환성 (및 C 프로그램을 C ++로 컴파일 할 수있는 기능) 때문에 사용 중단이 성가시다는 점을 강조합니다. 그러나 C 프로그램을 C ++로 직접 컴파일하는 것은 이미 실망스러운 경험이 될 수 있으므로 고려해야 할 사항이 있는지 확실하지 않습니다.

왜 변경되었는지 아는 사람이 있습니까?


3
C의 네임 스페이스 범위에서 개체를 선언합니까?
Etienne de Martel

heh, thx, 어디서 얻을 수 있는지 찾았습니다. 댓글을 삭제하려고했지만 거기에서 나를 이겼습니다.
Edward Strange


1
이것은 또한 C ++위원회에게 다음 버전의 Standard에서 어떤 것을 언데드 해제 할 수있는 기회를줍니다. :-)
James McNellis

답변:


75

에서 C ++ 표준 핵심 언어 결함 보고서 및 허용 문제, 개정판 94 에서 1012 Undeprecating 정적 `그들은주의 :

7.3.1.1 [namespace.unnamed]에서는 이름이 지정되지 않은 네임 스페이스가 우수한 대안을 제공하기 때문에 네임 스페이스 범위에서 변수를 선언하기위한 static 키워드 사용이 더 이상 사용되지 않는다고 명시하고 있지만, 가까운 장래에 해당 기능이 제거 될 가능성은 거의 없습니다. .

기본적으로의 지원 중단이 static실제로 의미가 없다고 말합니다 . C ++에서 제거되지는 않으며 내부 연결이있는 함수 나 개체를 선언하려는 경우 이름이 지정되지 않은 네임 스페이스에 필요한 상용구 코드가 필요하지 않기 때문에 여전히 유용합니다.


2
더 이상 사용되지 않는 것은 사람들이 이름없는 네임 스페이스를 대신 사용하도록 장려하는 것 같습니다. 이는 좋은 일입니다.
sbi

1
@unaperson : 다른 이유가 없다면 이름이 지정되지 않은 네임 스페이스가 TU 내부에 변수, 상수, 함수 및 유형을 만드는 동일한 메커니즘을 제공하기 때문입니다. static class ... , OTOH, 작동하지 않습니다.
sbi 2011

2
@nbt : 정적 기호를 템플릿 인수로 사용할 수없고 많은 초보자가 정적을 사용하기 더 쉽게 찾은 다음 <functional> 및 <algorithm> 등을 시도하지 않기 때문입니다. 잠깐 생각하세요.
Sebastian Mach

2
"이름이없는 네임 스페이스에 필요한 상용구 코드가 필요하지 않기 때문에"? 무슨 "상용구 코드"? " namespace {"및 " }" 이외의 항목이 있습니까?
towi

1
@ErikAronesty 같은 이름의 다른 파일에 "로컬 클래스"가있는 경우 ODR 위반을 커밋합니다.
LF

32

나는 당신의 질문에 대답하려고 노력할 것입니다. 비록 그것은 오래된 질문이고 그다지 중요하지 않은 것 같고 (정말 그 자체로 는 그다지 중요하지 않습니다 ) 이미 꽤 좋은 대답을 받았습니다. 내가 대답하고 싶은 이유는 언어가 기존 언어를 기반으로 할 때 표준 진화 및 언어 디자인의 근본적인 문제와 관련이 있기 때문입니다. 언어 기능은 언제 폐기, 제거 또는 호환되지 않는 방식으로 변경해야합니까?

C ++에서는 번역 단위 내에서 static 키워드를 사용하여 심볼의 가시성 (변수 또는 함수 선언)에 영향을 미칠 수 있습니다.

실제로 연결.

n3092에서는 더 이상 사용되지 않습니다.

지원 중단은 다음을 나타냅니다.

  • 의도 미래의 어떤 기능을 제거; 이것은 더 이상 사용되지 않는 기능이 다음 표준 개정에서 제거되거나 "곧"제거되어야 함을 의미하지 않습니다. 더 이상 사용되지 않는 기능은 다음 표준 개정에서 제거 될 수 있습니다.
  • 그것의 사용막기 위한 공식적인 시도 .

후자의 요점이 중요합니다. 귀하의 프로그램이 다음 표준에 의해 때때로 조용히 깨지지 않을 것이라는 공식적인 약속은 없지만위원회는 "합리적인"코드를 위반하지 않도록 노력해야합니다. Deprecation은 프로그래머에게 어떤 기능에 의존하는 것이 부당 하다는 것을 알려야 합니다 .

그러나 C와의 호환성 (및 C 프로그램을 C ++로 컴파일 할 수있는 기능) 때문에 사용 중단이 성가시다는 점을 강조합니다. 그러나 C 프로그램을 C ++로 직접 컴파일하는 것은 이미 실망스러운 경험이 될 수 있으므로 고려해야 할 사항이 있는지 확실하지 않습니다.

특히 헤더 파일의 경우 C / C ++ 공통 하위 집합을 유지하는 것이 매우 중요합니다. 물론 static전역 선언은 내부 링크가있는 기호 선언이며 헤더 파일에서는 그다지 유용하지 않습니다.

그러나 문제는 단순히 C와의 호환성이 아니라 기존 C ++와의 호환성입니다 static. 전역 선언 을 사용하는 기존의 유효한 C ++ 프로그램이 많이 있습니다 . 이 코드는 공식적으로 합법적 일뿐만 아니라 의도 된 방식으로 잘 정의 된 언어 기능을 사용하므로 건전 합니다.

어떤 일을하기위한 "더 나은 방법"(일부에 따르면)이 있다고해서 프로그램이 예전 방식으로 "나쁜"또는 "불합리한"방식으로 작성된 것은 아닙니다. static전역 범위에서 개체 및 함수의 선언에 키워드를 사용하는 기능은 C 및 C ++ 커뮤니티 모두에서 잘 이해되고 있으며 가장 자주 올바르게 사용됩니다.

비슷한 맥락에서, 나는 C 스타일 캐스트로 변경 않을거야 doublestatic_cast<double>불과하기 때문에, "C 스타일 캐스트가 나쁜"등의 static_cast<double>영 정보와 제로의 안전을 추가합니다.

무언가를하는 새로운 방법이 발명 될 때마다 모든 프로그래머가 기존의 잘 정의 된 작업 코드를 재 작성하기 위해 서둘러야한다는 생각은 미친 짓입니다. 상속 된 C 추함과 문제를 모두 제거하고 싶다면 C ++를 변경하지 않고 새로운 프로그래밍 언어를 발명합니다. 한 번만 사용 static하면 C ++를 덜보기 흉하게 만들지 않습니다.

코드 변경은 정당화가 필요하며 "오래된 것은 나쁘다"는 코드 변경의 정당화가 아닙니다.

속보 언어 변경에는 매우 강력한 정당성이 필요합니다. 언어를 아주 약간 더 간단하게 만드는 것은 절대 변경 사항을 정당화 할 수 없습니다.

static나쁜지에 대한 이유 는 매우 약하고, 객체와 함수 선언이 함께 사용되지 않는 이유도 명확하지 않습니다. 서로 다른 처리를하면 C ++를 더 간단하거나 더 직교하게 만드는 일은 거의 없습니다.

그래서 정말 슬픈 이야기입니다. 실제적인 결과 때문이 아닙니다. 실제적인 결과는 정확히 0이었습니다. 그러나 ISO위원회의 상식이 분명하지 않기 때문입니다.


5
당신이 지적했듯이, 그것을 비난하는 요점은 사용을 막는 것입니다. 그러나 당신은 그것의 사용을 억제하는 것이 잘못된 것이라고 주장하지 않습니다. 익명의 네임 스페이스에 대해 네임 스페이스 범위의 정적 선언을 사용하도록 사람들을 장려하는 사람이 아무도 없기를 바랍니다. 그들은 특히 크로스 컴파일 C.에 필요하지 않는 한
니콜 올가미

2
나는 글로벌 스코프 static나 익명 네임 스페이스를 사용하는 사람들에 대해별로 신경 쓰지 않으며 , 나도 장려하거나 낙담하지 않습니다. 내 요점은 사람들이 익명의 네임 스페이스를 사용하지 못하도록 진정하려면 그들에게 좋은 주장을해야한다는 것입니다. 실제로는 이름이 지정되지 않은 네임 스페이스에 선언 된 대부분의 구현 엔터티가 임의의 이름으로 내 보내진 기호이므로 내보내기 테이블이 커진다고 생각합니다. static, OTOH 로 선언 된 엔티티는 어떤 방식으로도 내보내지지 않습니다. 따라서 많은 사람들이 그 관찰에 따라 static.
curiousguy dec.

2
" 당신이 지적했듯이, 그것을 비난하는 요점은 사용을 막는 것입니다. " 사용 을 막는 요점은 언젠가 사라질 수 있다는 것입니다. 내 요점은 네임 스페이스 범위 static가 사라지지 않을 것이기 때문에이를 폐기하는 것은 잘못된 것입니다. " 그러나 당신은 그것의 사용을 억제하는 것이 잘못되었다는 주장을하지 않는다. "나는 네임 스페이스 범위의 사용 static이 "잘못되었다"는 것을 보여주는 설득력있는 주장을 본 적이 없다 . 그 사용을 막기 위해 그것을 비난하는 것은 잘못된 것입니다. 실제로 아무도 그것이 사라질 것이라고 믿지 않고 그것을 사용하는 것이 "잘못된 것"이라고 사람들을 설득하지 않기 때문입니다.
curiousguy

5
모든 언어가 "언젠가 사라질 것"입니다. C ++를 더 이상 사용하지 않겠습니다.
궤도에서 가벼운 경주

2
"비슷한 맥락에서, static_cast <double>은 정보와 안전성을 추가하기 때문에"C 스타일 캐스트가 나쁘다 "는 이유만으로 C 스타일 캐스트를 double로 static_cast <double>로 변경하지 않을 것입니다." 하나의 프리미티브에서 다른 프리미티브로 C 스타일 캐스트를 자유롭게 사용하는 것에 대해 계속 불평하는 많은 소프트웨어 엔지니어와의 영원한 싸움입니다.
Makogan

14

더 이상 사용되지 않거나 그렇지 않은 경우이 언어 기능을 제거하면 기존 코드가 손상되고 사람들이 짜증나게됩니다.

전체 정적 사용 중단 문제는 "익명 네임 스페이스가 정적보다 낫다"와 "참조가 더 나은 포인터"라는 줄을 따라 희망적인 생각이었습니다. Lol.


1
"참조가 더 나은 포인터"입니까? 아니요, 스마트 포인터는 더 스마트 한 포인터입니다. 힙, 오류, 여유 저장소에서 할당 된 메모리에 대한 참조를 사용할 수 없습니다.
Dan Breslau

3
죄송합니다. 아이러니 한 스마일리로 끝내는 것을 잊었습니다.
Maxim Egorushkin 2011 년

2
@Dan : 바로이 대답이 말하는 것입니다 : 비슷한 잘못된 생각을 따라 "소망스러운 생각". 이름이 지정되지 않은 네임 스페이스는 전역 범위 정적과 마찬가지로 약간 다른 이유와 적용 가능성이 약간 겹치는 경우에도 중요한 기능입니다.
Fred Nurk 2011 년

@Fred, @Maxim : 내가 잘못 이해했거나 내 기억에 결함이 있으면 죄송합니다. 하지만 "참조가 더 나은 포인터"라고 분류하지 않고 "익명 네임 스페이스가 정적 인 것보다 낫다"와 같은 것으로 분류하지 않습니다. 나는 후자의 스틱을 만들려는 시도를 잘 알고 있지만 포인터를 참조로 대체하기 위해 진지한 제안을 한 사람을 기억하지 못합니다. 다시 말하지만, 부족한 것은 내 자신의 인식 때문일 수 있습니다.
Dan Breslau 2011 년

1
@DanBreslau : char* foo = new char; char& ref = *foo;포인터가 주어 졌기 때문에 처음에는 참조 사용 능력에 대해 아무 말도하지 않습니다.
궤도에서 가벼운 경주
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.