포워드 선언

Forward declaration

컴퓨터 프로그래밍에서, 전진 선언은 프로그래머가 아직 완전한 정의를 내리지 않은 식별자(유형, 변수, 상수, 함수 등의 실체를 나타냄)의 선언이다.

컴파일러는 식별자의 특정 속성(메모리 할당용 크기, 함수의 형식 서명 등 유형 확인용 데이터 유형)을 알아야 하지만, 특정 값(변수나 상수의 경우)이나 정의(함수의 경우)와 같은 다른 세부 사항은 알 수 없다. 이것은 특히 원패스 컴파일러별도 컴파일에 유용하다.

순방향 선언은 사용 전 선언이 필요한 언어에 사용된다. 이러한 언어의 상호 재귀에는 기능(또는 데이터 구조) 중 하나가 먼저 정의되어야 한다는 하나의 정의에서 순방향 참조 없이는 그러한 기능(또는 데이터 구조)을 정의할 수 없기 때문에 필요하다. 본체를 상단에 배치하고, 그 아래 기능을 호출하는 등 유연한 코드 구성을 허용하는 것도 유용하다.

다른 언어에서는 포워드 선언이 필요하지 않으며, 일반적으로 멀티패스 컴파일러와 일부 컴파일이 링크 시간을 위해 지연되어야 한다. 이러한 경우 식별자는 실행에 사용하기 전에 정의되어야 하지만(변수 초기화, 함수 정의) 컴파일 또는 해석을 위한 소스 코드에 사용하기 전에 정의할 필요는 없다. 식별자는 기존 실체에 즉시 해결할 필요가 없다.

C의 기본적인 예는 다음과 같다.

공허하게 하다 인쇄본보기정수(인트로); 

CC++에서 위의 선은 함수의 전방 선언을 나타내며 함수의 원형이다.선언을 처리한 후 컴파일러는 프로그램 코드가 엔티티를 참조하도록 허용한다. printThisInteger 나머지 프로그램에서도 말이야 기능에 대한 정의는 반드시 어딘가에 제공되어야 한다(동일한 파일 또는 다른 파일, 반드시 고유해야 하는 정의가 있는 하나 또는 여러 개체 파일의 특정 기능에 대한 참조를 올바르게 일치시키는 것이 링크너의 책임일 것이다).

공허하게 하다 인쇄본보기정수(인트로 x) {    활자화하다("%d\n", x); } 

변수는 전진 선언만 가지고 있고 정의가 결여되어 있을 수 있다. 컴파일 시간 중에는 언어별 규칙(정의되지 않은 값, 0, NULL 포인터 등)에 의해 초기화된다. 다른 소스/개체 파일에 정의된 변수에는 키워드와 함께 지정된 정방향 선언이 있어야 함 extern:

인트로 foo; //foo가 이 파일의 어딘가에 정의되어 있을 수 있음 바깥의 인트로 술집을 내다; //bar는 다른 파일에 정의되어야 함 

파스칼과 다른 위스 프로그래밍 언어에서는 모든 실체를 사용하기 전에 선언해야 한다는 것이 일반적인 규칙이며, 따라서 예를 들어 상호 재귀성을 위해 전진 선언이 필요하다. C에서는 동일한 일반 규칙이 적용되지만, 신고되지 않은 함수 및 불완전한 유형의 경우는 예외로 한다. 따라서 C에서는 다음과 같이 쌍의 상호 재귀 함수를 구현할 수 있다(현명한 것은 아니지만).

인트로 맨 처음의(인트로 x) {     만일 (x == 0)         돌아오다 1;     다른         돌아오다 둘째(x-1); // 두 번째를 향해 전진 참조 }  인트로 둘째(인트로 x) {     만일 (x == 0)         돌아오다 0;     다른         돌아오다 맨 처음의(x-1); // 첫 번째를 역참조 } 

파스칼에서는, 동일한 이행에 대해서, 의 전향적인 선언이 필요하다. second 그 용도에 선행하다 first. 포워드 선언이 없으면 컴파일러는 식별자를 나타내는 오류 메시지를 생성한다. second 신고되지 않고 사용되었음

C++, Objective-C와 같은 일부 객체 지향 언어에서는, 때때로 포워드 선언 클래스가 필요하다. 이는 수업명칭이 유형임을 알아야 하지만 구조를 알 필요가 없는 상황에서 이루어진다.

C++에서는 다음과 같이 클래스와 구조체를 전진 선언할 수 있다.

계급 마이클래스; 구조상의 마이스트락트; 

C++에서는 (모든 객체 포인터가 크기가 같으며, 이것이 컴파일러가 신경쓰는 것이기 때문에) 해당 클래스 유형에만 포인터를 사용하면 클래스를 정방향으로 선언할 수 있다. 클래스에 다른 클래스에 대한 포인터(또는 참조)인 멤버가 포함된 경우 등 클래스 정의 내에서 특히 유용하다.

전방 선언은 헤더 포함 수를 줄임으로써 컴파일 시간을 줄이는 데 도움이 되는 불필요한 결합을 피하기 위해 사용된다. 이는 3배 이상의 이점을 가진다.

  • #vmx(운영 체제 호출 수 감소)
  • 미리 설정된 파일의 볼륨 감소(헤더가 포함되지 않음)
  • 정방향 선언 클래스가 수정될 때 재컴파일 영향 감소.

실제 클래스 유형을 사용해야 하는 경우, 예를 들어 ( 포인터가 아닌) 직접 클래스를 사용하는 멤버가 있거나 기본 클래스로 사용해야 하는 경우, 클래스의 메소드를 어떤 방법으로 사용해야 하는 경우 클래스의 정방향 선언만으로는 충분하지 않다.

목표-C에서 클래스 및 프로토콜은 다음과 같이 전진 선언할 수 있다.

@class MyClass; @protocol MyProtocol; 

목표-C에서 클래스와 프로토콜은 개체 포인터 유형의 일부로만 사용해야 하는 경우(예: project pointer type) 전진 선언할 수 있다. MyClass * 또는 ID[MyProtocol]. 클래스에 다른 클래스에 대한 포인터가 있는 멤버가 포함된 경우 등 클래스 정의 내에서 특히 유용하며, 순환 참조(즉, 해당 클래스에 이 클래스에 대한 포인터가 되는 멤버도 포함할 수 있음)를 피하기 위해 클래스를 대신 정방향으로 선언할 수 있다.

클래스를 하위 클래스로 분류하거나 프로토콜을 구현해야 하는 경우 클래스 또는 프로토콜의 정방향 선언만으로는 충분하지 않다.

전진참조회

전진참조라는 용어는 전진선언의 동의어로 쓰이기도 한다.[1] 그러나 선언 전에 실사용(즉, 최초 언급)을 참조하는 경우가 더 많다. second 위의 코드에는 전진 참조가 있다.[2][3] 따라서 우리는 파스칼에서는 선도선언이 의무적이기 때문에 선도참고가 금지되어 있다고 말할 수 있다.

C++의 (유효한) 전진 기준의 예:

계급 C { 공중의:    공허하게 하다 돌연변이(인트로 x) { myValue = x; }    인트로 접근자() 경시하다 { 돌아오다 myValue; } 사유의:    인트로 myValue; }; 

이 예에서는 다음에 대한 두 가지 참조가 있다. myValue 공표되기 전에 C++는 일반적으로 정방향 참조를 금지하고 있지만, 학급 회원의 특수한 경우에는 허용된다. 멤버 함수 이후 accessor 컴파일러가 멤버 변수의 유형을 알 때까지 컴파일할 수 없음 myValue, 의 정의를 기억하는 것은 컴파일러의 책임이다. accessor 볼 때까지 myValue의 선언

정방향 참조를 허용하면 컴파일러의 복잡성과 메모리 요구사항을 크게 증가시킬 수 있으며, 일반적으로 컴파일러가 한 의 통과로 구현되는 것을 방지할 수 있다.

참조