코드가 널 포인터를 통해 명시 적으로 정적 메서드를 호출하는 이유는 무엇입니까?
몇 가지 오래된 프로젝트에서 다음과 같은 코드를 보았습니다.
class Class {
static void Method() {}
};
((Class*)0)->Method();
이 코드에는 이후에 어떤 일이 발생하더라도 널 포인터 역 참조가 포함되므로 정의되지 않은 동작이 포함됩니다. 정말 의미가 없습니다-캐스트는 컴파일러에 유형 이름을 제공하기 위해 거기에 있으며 위 코드를 작성한 사람은 대신 이것을 작성할 수 있습니다.
Class::Method();
후자는 괜찮을 것입니다.
왜 누군가 이전 코드를 작성하겠습니까? 좋은 옛날부터 알려진 관용구입니까?
정적 멤버 함수는 1989 년 AT & T C ++ 언어 시스템 (사전 표준화) 릴리스 2.0 에서 C ++에 추가되었습니다 . 그 전에는 static
키워드를 사용하여 정적 멤버 함수를 선언 할 수 없었기 때문에 코드 작성자는 주로 널 포인터를 간접적으로 관찰 한 방법 인 해결 방법을 사용했습니다.
에서 선정 된 독서 섹션 1-22에서 AT & T C ++ 언어 시스템의 버전 2.0을 동반, 스트로브 스트 룹의 글 :
다음과 같은 이식 불가능한 코드도 관찰되었습니다.
((X*)0)->f();
정적 멤버 함수를 시뮬레이션하는 데 사용되었습니다. 이 트릭은 조만간 누군가가
f()
이런 식으로 사용virtual
되는를 만들고X
주소 0에 객체 가 없기 때문에 호출이 끔찍하게 실패 하기 때문에 시한 폭탄 입니다.f()
가상이 아닌 곳에서도 이러한 호출은 일부 동적 연결 구현에서 실패합니다.
귀하의 코드는 Cfront 1.0에서 컴파일하도록 작성되었거나 정적 멤버 함수를 언어에 추가 할 때 인식하지 못한 사람이 작성했습니다.
멤버 함수의 주석은 Cheers와 hthstatic
처럼 실제로 퍼즐 입니다. -Alf 가 관찰했습니다. Cfront 1.0은 다음과 같이 해당 코드를 거부했을 것입니다.
error: member Method() cannot be static
그래서 처음에는 거기에있을 수 없었습니다. 나는 Potatoswatter 가 가장 정확 하다고 생각 합니다. static
나중에 Method
C ++ 2.0 컴파일러의 사용이 보장 될 수 있지만 호출 코드가 업데이트되지 않으면의 정적 메서드 속성을 문서화하고 적용하기 위해 나중에 추가 되었습니다. 이를 확인하려면 원래 프로그래머와 인터뷰하거나 최소한 소스 제어 기록 (존재하는 경우)을 조사해야합니다.
'Nice programing' 카테고리의 다른 글
Shebang 표기 : Windows 및 Linux의 Python 스크립트? (0) | 2020.12.25 |
---|---|
R / Shiny로 다이나믹 한 수의 입력 요소 생성 (0) | 2020.12.25 |
다른 포트 뒤에있는 단일 Tomcat 인스턴스에서 다른 앱을 실행하는 방법은 무엇입니까? (0) | 2020.12.25 |
날짜 범위가있는 적절한 REST 형식 URL (0) | 2020.12.25 |
iOS 8 자동 셀 높이-마지막 행으로 스크롤 할 수 없음 (0) | 2020.12.25 |