2011-01-10 2 views
1

제목에서 알 수 있듯이이 오류의 원인을 알고 있지만 컴파일러가이 상황에서 왜 그것을 제공하는지 알고 싶습니다.C에서 정의되기 전에 함수를 사용할 때 암시 적으로 선언 할 때 컴파일러에서 알아낼 수없는 이유는 무엇입니까?

예 :

main.c를

void test(){ 
    test1(); 
} 

void test1(){ 
    ... 
} 

그것의 선언을 읽기 전에, 나는 명백한 문제를 볼 수 있습니다 TEST1()에 대한 호출에 도달 할 것입니다 컴파일러 같은 암시 적 선언 경고를 줄 것인가 이 (반환 형식을 모르는 등),하지만 왜 컴파일러는 모든 함수 선언을 얻는 간단한 단계를 수행하지 못하고 이러한 오류를 제거하는 코드를 컴파일합니까? 그냥 그렇게하는 것이 단순 해 보이고 나는 다른 언어로 비슷한 경고를 보았다고 생각하지 않습니다.

내가 간과하는이 상황에서이 경고의 특정 목적이 있는지 알 수 있습니까?

답변

0

짧은 대답 : C가 너무 ooooold이기 때문에. :-)

답 : C 컴파일러와 링커는 완전히 별개입니다. 서로 다른 소스 파일에서 서로 다른 기능을 정의한 다음 서로 링크 할 수 있습니다. 이 경우 test1을 별도의 라이브러리 소스 파일에 정의한다고 가정 해보십시오. 컴파일러는 다른 파일을 컴파일 할 때까지 test1에 대해 알지 못하며 다른 파일을 따로 컴파일하므로 컴파일 할 때 알 수 없습니다. test. 그러므로 여러분은 그것을 말해야합니다. '예, 다른 곳에서는 실제로 test1이 정의되어 있으며 여기에는 서명이 있습니다.' 그래서 보통이 기능을 사용해야하는 다른 소스 파일에 헤더 파일 (.h)을 포함시킵니다.

+0

내가 생각하기에, 오래 전에 설계된 도구에서 숙취라고 생각하세요! – rolls

3

이것이 C의 정의입니다.

사용 전에 기호를 사용하도록 지정하는 규칙을 사용해야합니다.

대부분 컴파일러에서 사용하기 쉽습니다.

5

C는 꽤 오래된 언어이므로 1972 년으로 거슬러 올라갑니다. 메모리와 속도 제약 때문에 의도적이었습니다.

컴파일러는 파일을 한 번 검사하여 컴파일에 필요한 모든 것을 알아야합니다. 두 번 통과하는 것이 더 비쌀 것이므로이 규칙은 오늘날에도 살아 남았습니다.

또한이 규칙은 컴파일러 작성자의 삶을 편하게 만듭니다. 자동 완성을위한 IDE의 수명은 말할 것도없고, 더 쉽게 삶을 살 수 있습니다.

그래서 프로그램 작성자에게는 약간의 성가심 때문에 컴파일러 작성자와 IDE 제작자의 삶이 편하게됩니다.

아, 프로그램이 더 빨리 컴파일됩니다. 손에 멀티 만 코드 기반이있을 때 나쁘지 않습니다.

0

이렇게 보이지 않을 수도 있지만,이 방법을 사용하면 시간이 절약됩니다! 수천 개의 파일이있는 컴파일 단위를 컴파일한다고 가정 해보십시오. 시나리오에서 컴파일러는 먼저 수천 개의 파일을 확인하고 "오 이런 함수가 존재하지 않습니다. 중단"을 확인해야합니다. 구현 방법에 따라 정의되지 않은 함수가 발견되는 즉시 편집이 중단됩니다. 이렇게하면 시간을 절약 할 수 있습니다.

+0

정의 된 시간 외에는 잘못된 순서로 작성됩니다. 그러면 시간 낭비입니다! – rolls