4

다음 프로그램이 C에서 Undefined Behaviour을 호출합니까? 위의 프로그램에서C에서의 암시 적 선언

int main() 
{ 
    printf("Printf asking: Where is my declaration ?"); 
} 

그래서 위의 코드 호환 완전히 표준 아니면 그냥 몇 가지 구현 고유의 동작을 가지고, printf()의 암시 적 선언이 무엇입니까?

+0

글쎄, 값을 반환하지 않는다는 것 외에도 ... –

+2

C99에서'main()'의 명시적인'return 0 '은 선택 사항입니다. 편집 된 태그 :-) –

답변

7

예. 범위가 선언되지 않은 것은 UB입니다.

J.2 정의되지 않은 동작

- 기능 함수 프로토 타입으로 정의 된 범위에서 함수 원형없는 함수 호출에 대해, 하나의 프로토 타입은 생략하여 단부 또는 프로모션 후의 인수 유형이 매개 변수 (6.5.2.2)의 유형과 호환되지 않는 이 아닙니다.

또한 주에서 벗어나는 것은 C99에서 괜찮습니다 (즉, 의미 상으로는 return 0;에 해당). C99 이전 컴파일러의 경우 return 문이 필요합니다. 주 함수의 반환 유형은 int과 호환되는 유형입니다.

+0

Thanks for J.2, AC :) –

+5

그 이유는 'printf'의 매개 변수 목록이 줄임표로 끝나야한다는 것입니다. 매개 변수의 타입이 정확하기 때문에'puts '에는 적용되지 않습니다. –

+0

줄임표는 함수 구현에만 영향을 미칩니다. 값은 스택에 같은 방법으로 푸시됩니다. 이것은 C의 편리함 중 하나로 간주됩니다. 스택에서 원하는 것을 밀어 낼 수는 있지만 다시 정리해야합니다. 반면 델파이는 스택을 정리하기 위해 호출 된 루틴을 필요로했습니다. –