why is this a warning rather than an error?
그런 이유로 유산 코드가 많이 있기 때문에. 컴파일러 오류로 인해 문제가 발생합니다.
If the compiler cannot see the function, what happens when the function is called at runtime? Does the linker ultimately resolve this issue?
은의이 예를 살펴 보자 :
int main()
{
foo();
return 0;
}
컴파일러 작업 int foo(...)
같은 자신의 함수 서명을 생성하고 사용합니다. 그런데 그것은 매우 흥미로운 오류를 가져올 수 있습니다. 그래서 객체 파일은이 함수의 호출을 포함 할 것이고 그것은 괜찮습니다. 링크하려고하면 오류가 발생합니다 :`foo '에 대한 정의되지 않은 참조. 그러나 foo
정의가있는 다른 모듈이 있으면 링커에서 이름을 찾아 링크합니다.
Or are we to assume that the behaviour of calling a function that produced such warning is unknown?
내가 말했듯이 그것은 약간의 이상한 오류를 유발할 수 있습니다. int i = foo()
및 foo
과 같은 코드에 서명이 없다고 상상해보십시오. 그리고 다른 모듈에서 다음과 같은 것을 가지고 있습니다 : int * foo(){...}
. 64 비트 모드에서 응용 프로그램을 빌드 할 때는 i
에만 64 비트 포인터의 32 비트를 넣습니다. 따라서 실제로 프로그램의 동작이 알려지지 않았다고 말할 수 있습니다.
당신은 함수가 임의의 수 또는 유형의 인수를 취할 수 있고'int'를 반환한다고 가정해야합니다. 적어도 컴파일러가하는 일입니다. 이것은 사양의 차후 버전에서 제거 될 수 있습니다. – user3386109
암시 적'int' 규칙은 더 이상 표준에 없지만 ... 여전히 확장자로 작동 할 수 있습니다. 나는 컴파일러가'int' 리턴을 가정 할 수 없다는 것을 현재 표준에서 생각하지 않는다. 단지 더 이상 필요하지 않고 (그리고 진단을 내야한다). – Dmitri