정적 키워드 지원 중단… 더 이상? 제거되었습니다. 내가 찾을 수있는 유일한 기사는

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

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

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

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

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

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

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



답변

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

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

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


답변

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

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위원회의 상식이 분명하지 않기 때문입니다.


답변

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

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


답변