2016-07-22 7 views
2

이것은 C 프로그램에 나타나는 "implicit declaration of function"경고를 해결하는 방법에 관한 질문이 아니며, 여러 번 이미 answered되었습니다."함수의 암시 적 선언"이 단지 경고 인 이유는 무엇입니까?

나는 이것이 컴파일러 경고라는 것을 알고 있는데, 나는 왜 이것이 오류가 아닌 경고인지 궁금하다. 컴파일러에서 함수를 볼 수없는 경우 런타임에 함수를 호출하면 어떻게됩니까? 링커가 궁극적으로이 문제를 해결합니까? 또는 그러한 경고를내는 함수를 호출하는 동작을 알 수 없다고 가정해야합니까?

+0

당신은 함수가 임의의 수 또는 유형의 인수를 취할 수 있고'int'를 반환한다고 가정해야합니다. 적어도 컴파일러가하는 일입니다. 이것은 사양의 차후 버전에서 제거 될 수 있습니다. – user3386109

+1

암시 적'int' 규칙은 더 이상 표준에 없지만 ... 여전히 확장자로 작동 할 수 있습니다. 나는 컴파일러가'int' 리턴을 가정 할 수 없다는 것을 현재 표준에서 생각하지 않는다. 단지 더 이상 필요하지 않고 (그리고 진단을 내야한다). – Dmitri

답변

1

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 비트를 넣습니다. 따라서 실제로 프로그램의 동작이 알려지지 않았다고 말할 수 있습니다.

-1

표준 장소 진단에 관한 구현에 매우 몇 가지 요구 사항 :

5.1.1.3 Diagnostics

1     A conforming implementation shall produce at least one diagnostic message (identified in an implementation-defined manner) if a preprocessing translation unit or translation unit contains a violation of any syntax rule or constraint, even if the behavior is also explicitly specified as undefined or implementation-defined. Diagnostic messages need not be produced in other circumstances. 9)
9) The intent is that an implementation should identify the nature of, and where possible localize, each violation. Of course, an implementation is free to produce any number of diagnostics as long as a valid program is still correctly translated. It may also successfully translate an invalid program.
+0

이 대답은 또한 컴파일러가 정의되지 않은 전역 변수에 대한 참조에 대해 경고가 아닌 오류를 표시하는 이유를 설명합니다. – immibis

0

때문에 사용하고있는 것을 포함하여 주류 컴파일러에 의해 이월 유해 전통. 고맙게도 보통 gcc 및 호환 컴파일러의 경우 -Werror=implicit-function-declaration과 같이 오류로 만들 수있는 옵션이 있습니다.