다음 "C"코드를 고려하십시오.
#include<stdio.h>
main()
{
printf("func:%d",Func_i());
}
Func_i()
{
int i=3;
return i;
}
Func_i()
는 소스 코드의 끝에 정의되며에서 사용하기 전에 선언이 제공되지 않습니다 main()
. 컴파일러가 들어 왔을 때 , 그것은 컴파일러 Func_i()
에서 나온다 . 컴파일러는 어떻게 든 반환 값을 찾아서 제공합니다 . 또한 컴파일러가의 반환 유형 을 찾을 수 없음을 알고 있습니다 . 그것은에 의해 디폴트는 (추측?) 걸리는 반환 형식 의 수하는을 . 코드에 코드가 있다면 컴파일러 는 다음과 같은 오류를 발생시킵니다 : Conflicting types for .main()
main()
Func_i()
Func_i()
printf()
Func_i()
Func_i()
int
float Func_i()
Func_i()
위의 논의에서 우리는 다음을 볼 수 있습니다.
컴파일러는에서 반환 한 값을 찾을 수 있습니다
Func_i()
.- 컴파일러가 소스 코드에서 나와 소스 코드를 검색
Func_i()
하여 반환 된 값을 찾을 수 있으면 명시 적으로 언급 된main()
Func_i () 유형을 찾을 수없는 이유는 무엇입니까 ?
- 컴파일러가 소스 코드에서 나와 소스 코드를 검색
컴파일러는
Func_i()
float 유형 임을 알아야합니다 . 따라서 충돌하는 유형의 오류가 발생합니다.
- 컴파일러가 그것이
Func_i
float 유형 이라는 것을 알고 있다면 왜 여전히Func_i()
int 유형 이라고 가정 하고 충돌하는 유형의 오류를 제공합니까? 왜Func_i()
float 형식이되도록 강요하지 않습니까?
변수 선언에 대해서도 같은 의심이 있습니다. 다음 "C"코드를 고려하십시오.
#include<stdio.h>
main()
{
/* [extern int Data_i;]--omitted the declaration */
printf("func:%d and Var:%d",Func_i(),Data_i);
}
Func_i()
{
int i=3;
return i;
}
int Data_i=4;
컴파일러는 'Data_i'undeclared (이 함수에서 처음 사용) 오류를 표시합니다.
- 컴파일러가를 보면
Func_i()
Func_ ()에 의해 반환 된 값을 찾기 위해 소스 코드로 내려갑니다. 컴파일러가 Data_i 변수에 대해 동일한 작업을 수행 할 수없는 이유는 무엇입니까?
편집하다:
컴파일러, 어셈블러, 프로세서 등의 내부 작업에 대한 세부 정보를 모릅니다. 내 질문의 기본 아이디어는 사용 후 마지막으로 소스 코드에서 함수의 반환 값을 말하면 (쓰기) "C"언어를 사용하면 컴퓨터가 오류없이 해당 값을 찾을 수 있습니다. 이제 컴퓨터가 왜 비슷한 유형을 찾을 수 없습니까? Func_i ()의 반환 값을 찾았으므로 Data_i 유형을 찾을 수없는 이유는 무엇입니까? extern data-type identifier;
문을 사용하더라도 해당 식별자 (함수 / 변수)에서 값을 반환하도록 지시하지 않습니다. 컴퓨터가 해당 값을 찾을 수 있으면 왜 유형을 찾을 수 없습니까? 왜 전진 선언이 필요합니까?
감사합니다.
Func_i
유효하지 않습니다. 정의되지 않은 변수를 암시 적으로 선언하는 규칙은 없었으므로 두 번째 조각은 항상 형식이 잘못되었습니다. (예, C89 / C90에서 느슨하면 유효하기 때문에 컴파일러는 여전히 첫 번째 샘플을 수락합니다.)