C 언어에서 함수 프로토타입은 함수의 반환 유형, 이름 및 매개변수 유형을 실제 구현 전에 컴파일러에 알리는 선언입니다. 프로토타입은 일반적으로 헤더 파일(.h)에 위치합니다. 이를 사용하면:
프로토타입 예:
// math_utils.h int sum(int a, int b); // 함수 프로토타입
// main.c #include "math_utils.h" int main() { int result = sum(3, 4); // 컴파일러는 sum의 시그니처를 알고 있습니다. }
프로토타입이 없으면 함수는 int를 반환하고 정의되지 않은 수의 매개변수를 받는 것으로 간주되어 실행 시간에 예기치 않은 오류를 초래할 수 있습니다.
질문: C에서 프로토타입으로 선언되지 않은 함수가 정의되기 전에 호출될 수 있습니까?
답변: C89 표준에서는 반환값이 int일 경우 함수가 정의되기 전에 호출되는 것이 허용되었고, 매개변수는 확인되지 않았습니다 (암시적 int, 암시적 승격). 현대 표준에서는 경고 또는 오류를 초래하며, 이러한 접근 방식은 사용해서는 안 됩니다.
오류 예:
int main() { foo(1, 2); // foo의 프로토타입 없음 } int foo(double x, double y) { ... }
컴파일러는 매개변수를 int로 간주하여 함수를 호출하지만, 시그니처는 double을 암시하므로 결과는 UB 또는 잘못된 값이 됩니다.
이야기
대형 과학 프로젝트의 모듈 중 일부에서 데이터 처리 함수의 프로토타입이 누락되었습니다.
float를int로 전달할 경우 오류는 실행 단계에서 비정상적인 계산이 발생한 후에야 발견되었습니다. 컴파일은 오류 없이 성공적으로 완료되었습니다.
이야기
모듈화된 빌드 자동화 도구에서 함수는
.c파일에서만 정의되었고 헤더에서는 선언되지 않았습니다. 두 모듈에서 동일한 이름과 호환되지 않는 매개변수를 가진 함수가 정의되어 링크 시 어려운 오류가 발생했습니다.
이야기
임베디드 시스템 프로젝트에서 초기화 함수가 프로토타입 없이 정의되기 전에 호출되는 문제가 발생했습니다. 컴파일러가 매개변수와 반환 유형을 잘못 추정하여 로직이 크게 손상되고 메모리 조직이 다른 특정 빌드에서만 시스템이 오류가 발생했습니다.