programing

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

nasanasas 2020. 9. 22. 08:18
반응형

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


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

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

부록 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>영 정보와 제로의 안전을 추가합니다.

The idea that whenever a new way to do something is invented, all programmers would rush to rewrite their existing well-defined working code is just crazy. If you want to remove all the inherited C ugliness and problems, you don't change C++, you invent a new programming language. Half-removing one use of static hardly makes C++ less C-ugly.

Code changes need a justification, and "old is bad" is never a justification for code changes.

Breaking language changes need a very strong justification. Making the language very slightly simpler is never a justification for a breaking change.

The reasons given why static is bad are just remarkably weak, and it isn't even clear why not both objects and function declarations are deprecated together - giving them different treatment hardly makes C++ simpler or more orthogonal.

So, really, it is a sad story. Not because of the practical consequences it had: it had exactly zero practical consequences. But because it shows a clear lack of common sense from the ISO committee.


Deprecated or not, removing this language feature would break existing codes and annoy people.

The whole static deprecation thing was just wishful thinking along the lines of "anonymous namespaces are better than static" and "references are better pointers". Lol.

참고URL : https://stackoverflow.com/questions/4726570/deprecation-of-the-static-keyword-no-more

반응형