문제

나는 약간 혼란 스럽다. 선언 선언과 전방 참조의 차이점은 무엇입니까? 포워드 선언은 내 머리 속에 아직 구현되지 않은 함수를 선언 할 때, 이것이 잘못 되었습니까? "전진 참조"또는 "전진 선언"을 선언하려면 지정된 상황을 살펴 봐야합니까?

도움이 되었습니까?

해결책

에서 위키 백과:

선언 선언

아직 정의되지 않은 변수 또는 함수의 선언. 그들의 방어는 나중에 볼 수 있습니다.

전진 참조

전달 선언과 유사하지만 변수 또는 함수가 먼저 나타나는 경우 정의도 제시됩니다.

다른 팁

선언 선언 구현 및 사용하기 전에 메소드 또는 변수의 선언입니다. 선언 선언의 목적은 컴파일 시간을 절약하는 것입니다.

변수의 전달 선언은 저장 공간을 따로 설정하게되므로 나중에 해당 변수의 값을 설정할 수 있습니다.

함수의 전달 선언은 "함수 프로토 타입"이라고도하며 컴파일러에게 함수의 리턴 유형이 무엇인지, 함수 이름이 무엇인지, 매개 변수 유형을 알려주는 선언문입니다. C/C ++ 및 Pascal Store와 같은 언어로 된 컴파일러는 조회 테이블에있는 기호 (기능 포함)를 선언하고 코드에서 이들을 가로 질러 참조합니다. 이 컴파일러는 코드를 순차적으로 읽습니다. 즉, 위에서 아래로 표시되므로 선언하지 않으면 컴파일러는 조회 테이블에서 참조 할 수없는 기호를 발견하고 모르는 오류가 발생합니다. 기능에 응답하는 방법.

전달 선언은 다른 곳에서 함수를 정의한 (구현을 채우는) 컴파일러에 대한 힌트입니다.

예를 들어:

int first(int x); // forward declaration of first

...

int first(int x) {
   if (x == 0) return 1;
   else return 2;
}

그러나 왜 우리는 왜 컴파일러가 모든 소스 파일에 두 번의 패스를 만들지 않는 이유는 무엇입니까? 첫 번째 기호를 내부에 색인하고 두 번째는 참조를 구문 분석하고 찾아보십시오. Dan Story에 따르면 :

1972 년에 C가 만들어 졌을 때, 컴퓨팅 리소스는 훨씬 더 부족하고 높은 프리미엄으로, 복잡한 프로그램의 전체 상징적 테이블을 한 번에 저장하는 데 필요한 메모리는 대부분의 시스템에서 사용할 수 없었습니다. 고정 스토리지도 비싸고 매우 느 렸기 때문에 가상 메모리와 같은 아이디어 나 디스크에 상징적 인 테이블의 일부를 저장하는 아이디어는 단순히 합리적인 기간 동안 컴파일을 허용하지 않았을 것입니다 ... Seek Times가있는 자석 테이프를 다룰 때 초 단위로 측정되고 읽기 처리량은 초당 바이트 (킬로 바이트 또는 메가 바이트가 아님)로 측정되었으며, 이는 매우 의미가있었습니다.

C ++는 거의 17 년 후 생성되었지만 C의 슈퍼 세트로 정의되었으므로 동일한 메커니즘을 사용해야했습니다.

1995 년에 Java가 돌아 왔을 때, 평균 컴퓨터는 복잡한 프로젝트의 경우에도 상징적 인 테이블을 보유하는 충분한 메모리를 가졌다. 그리고 Java는 C와 후진 호환되도록 설계되지 않았으므로 레거시 메커니즘을 채택 할 필요가 없었습니다. C#도 비슷하게 방해받지 않았습니다.

결과적으로, 그들의 디자이너들은 구획 상징적 선언의 부담을 프로그래머에게 다시 옮기고 컴퓨터에 다시 넣었습니다. 수집의 총 노력에 비례하여 비용이 최소화 되었기 때문에 컴퓨터에 다시 넣었습니다.

Java 및 C#에서 식별자는 소스 파일에서 자동으로 인식되고 동적 라이브러리 기호에서 직접 읽습니다. 이 언어에서는 같은 이유로 헤더 파일이 필요하지 않습니다.

전진 참조 반대입니다. 그것은 선언 전에 실체의 사용을 말합니다. 예를 들어:

int first(int x) {
   if (x == 0) return 1;
   return second(x-1); // forward reference to second
}

int second(int x) {
   if (x == 0) return 0;
   return first(x-1);
}

"전방 참조"는 때때로 "전진 선언"의 동의어로서 때때로 사용됩니다.

전방 선언은 언어 (C, Pascal)의 단일 패스 편집을 허용하는 데 사용됩니다.

전방 선언 (Java, C#)없이 전방 참조가 허용되는 경우 2 패스 컴파일러가 필요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top