얼핏 보면 fbar(2)를 호출하는 부분이 프로토타입과 맞지 않다고 생각할 수 있다. 선언할 때는 인수 타입이 double이라고 했는데 호출할 때는 signed int 타입 값을 전달했기 때문이다. 하지만 호출문에서는 어떤 타입의 값을 받을지 이미 알고 있기 때문에 호출 전에 signed int 타입인 2를 double 타입으로 변환한다. 이 함수의 리턴 값을 표현식에서 활용할 때도 마찬가지다. 리턴 타입이 double이란 사실을 알고 있기 때문에 표현식에서는 부동 소수점 나눗셈을 적용한다.
C 언어는 프로토타입 없이 함수를 선언하는 옛날 방식도 지원하지만, 이 방식은 다음 버전에서 삭제될 예정이므로 이 책에서는 이 표현은 사용하지 않는다. 여러분도 이 방식으로 적지 않기 바란다.
TAKEAWAY 7.1 함수는 항상 프로토타입이 있어야 한다.
그런데 printf처럼 매개변수의 개수가 일정하지 않은 함수는 이 규칙이 적용되지 않는다. 이럴 때는 가변 인수 리스트(variable argument list)C라는 매개변수 처리 메커니즘이 적용된다. 이 기능은 stdargs.h 헤더 파일에 정의돼 있다.
구체적인 작동 방식은 16.5.2절에서 설명하는데, 이 기능은 사용하지 않는 것이 좋다. printf를 사용하면서 이런 인터페이스를 사용할 때의 어려움을 이미 느껴 봤을 것이다. 즉, 함수 호출문을 작성하는 입장에서 일관성을 유지하기 위해서는 "%XX" 포맷 지정자를 정확하게 적어야 하는 부담이 있다.
함수의 구현 코드를 작성할 때는 리턴 타입이 void가 아니라면 정확한 타입의 값을 리턴해야 한다. return문은 함수 안에 여러 개 있을 수 있다.