인프런 커뮤니티 질문&답변
프로토타입과 함수간의 인자 불일치
해결된 질문
작성
·
36
1
main.c 파일에만 코드가 있을때, 프로토타입 함수의 인자를 예를 들어 10개를 넣었고, 정작 해당 프로토타입의 본체인 함수에는 인자를 2개 넣어도 정상작동을 하고,
main.c파일과 헤더파일과 c파일을 따로 만들었을때, 헤더파일에 있는 프로토타입이 따로있는 c파일에 있는 함수랑 타입이나 인자가 다르면 에러가 뜨는데
전자랑 후자랑 단순 파일을 분리한 차이만 있는데 어떠한 이유로 전자는 컴파일이 성공하고 후자는 실패하는걸까요?
답변 2
0
안녕하세요? 질문&답변 도우미 durams입니다.
이전 질문 관련해서 여러가지 검증을 하고 계신것 같습니다만, 말씀해주신 내용만으로는 정확히 어떤 상황인지 이해가 어렵습니다. 이전 제가 드렸던 답변과 더불어, '헤더 파일의 포함'은 해당 내용을 복사-붙여넣기 하는 것과 같다는 점에 유의하신다면 이해에 어려움은 없으실 것이라 생각됩니다.
고민 후에도 명확한 답을 얻지 못하셨다면 해당 코드 첨부해주시면 도와드리겠습니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "avg3.h"
int main(void) {
double m = avg3(10, 20, 40);
printf("avg3(10,20,40) = %.2f\n", m);
return 0;
}
// 여기까지가 main.c
#pragma once
double avg3(int a, int b, int c, int acc, int asdq);
//여기까지가 cal.h
#include "cal.h"
double avg3(int a, int b, int c) {
return (a + b + c) / 3.0;
}
//여기까지가 cal.c
첫번째 코드는 메인에 전부 통합한 형태에서 프로토타입과 함수간의 인자가 불일치하지만 정상적으로 컴파일이 되는데,
두번째에서도 마찬가지로 프로토타입과 함수간의 인자가 불일치하지만 main.c,cal.h,cal.c로 분리한 형태에선 컴파일이 실패하는데 파일 분리말곤 코드자체는 동일한거 같은데 컴파일러 에러가 뜨는 이유가 궁금합니다
첫 번째 코드
int add(str, arr);는 함수 선언입니다. 특이하게도 파라미터 타입을 생략하셨는데, 권장되지 않는 문법입니다. 하지만 뒤의 정의와 파라미터 개수가 같아 '전방선언 후 정의'하는 형태가 되어 결과적으로는 동작합니다.double avg3(int a, int b, int c, int acc, int asdq);라는 선언은 파라미터가 5개고,double avg3(int a, int b, int c)라는 정의에서는 파라미터가 3개 존재하기 때문에 C언어 표준 관점에서는 잘못된 코드입니다.일단 컴파일도 되고 실행도 되지만 선언과 정의에서의 파라미터가 다르다는 경고가 발생합니다.
두 번째 코드
main.c에서avg3.h를 include한다고 되어있으나, 해당 파일 내용은 제시되어있지 않네요. 정황상cal.h와cal.c가avg3.h/avg3.c라고 해석했습니다.main.c에서 인자 3개를 받는avg3함수를 호출하고 있는데, 헤더 파일에서 제공한 함수 선언 상으로는 인자 5개를 요구하고 있기 때문에 컴파일 에러가 발생합니다.
코드 분리말곤 코드 자체가 동일하다고 해주셨지만, 오히려 분리했기 때문에 문제가 '없던 것처럼' 보이던 코드가 터졌다고 보시면 되겠습니다.
0
안녕하세요, 인프런 AI 인턴입니다. luki님.
질문해주신 내용은 C의 함수 선언과 정의 간의 불일치가 파일 분리에 따라 다른 결과를 나타내는 이유에 대한 것인데요. 간단하게 설명드리겠습니다.
단일 파일 내의 컴파일러 동작:
- 만약
main.c안에서 프로토타입과 함수 정의 간에 인자 개수나 타입 불일치가 있더라도, 컴파일러는 같은 파일 내에서 정의와 사용을 모두 찾을 수 있습니다. 컴파일러는 이러한 불일치에 대해 경고를 할 수 있지만, 프로그램이 일단 실행되기는 합니다. 컴파일러는 함수 호출 부분에서 제공된 인자에 기반하여 프로토타입을 보고 호출을 시도할 수 있으며, 정의된 함수에서 실제로 어떻게 다뤄질지는 따로 확인하지 않습니다.
- 만약
파일 분리 시 컴파일러 및 링커 동작:
- 코드가 여러 파일로 분리되었을 경우, 헤더 파일에 정의된 프로토타입을 사용하여 다른 파일의 함수들을 호출하게 됩니다. 이 때, 프로토타입과 실제 함수 정의 간의 불일치가 있으면, 링킹 과정에서 정의된 함수 시그니처에 맞지 않기 때문에 에러가 발생합니다. 분리된 파일에서는 컴파일러는 파일 단위로만 컴파일을 진행하고, 함수의 실질적인 맞춤 여부는 나중에 링크 단계에서 검사되기 때문입니다.
- 코드가 여러 파일로 분리되었을 경우, 헤더 파일에 정의된 프로토타입을 사용하여 다른 파일의 함수들을 호출하게 됩니다. 이 때, 프로토타입과 실제 함수 정의 간의 불일치가 있으면, 링킹 과정에서 정의된 함수 시그니처에 맞지 않기 때문에 에러가 발생합니다. 분리된 파일에서는 컴파일러는 파일 단위로만 컴파일을 진행하고, 함수의 실질적인 맞춤 여부는 나중에 링크 단계에서 검사되기 때문입니다.
다음의 링크들은 유사한 주제를 다루고 있어 도움이 될 수 있습니다:
- 질문 - main.c에는 새로이지정한 함수의 프로토타입만 있는 헤더파일만이 include된것이지 그 내용이 정의된 my print function .c 가 include된건 아닌데 어떻게 정상실행되나요?
- 질문 - 헤더파일에서 함수바디를 따로 저장했을때 디파인 오류가 납니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





