이 오류는 동일한 이름의 함수가 서로 다른 타입으로 중복 정의되었을 때 발생합니다. C언어에서는 함수가 한 번 선언되거나 정의된 후에는 그 시그니처(반환형, 매개변수 타입 등)가 일치해야 합니다. 만약 서로 다른 형태로 선언되거나 정의되면 타입 충돌(conflicting types) 오류가 발생합니다.
주로 함수의 반환형이나 매개변수 선언이 일치하지 않는 경우, 또는 선언부와 정의부가 따로 작성되었는데 타입이 다를 때 발생합니다.
다음은 오류가 발생하는 예시입니다.
#include <stdio.h>
void greet(); // 선언: 반환형 void
int greet() { // 정의: 반환형 int
printf("Hello!\n");
return 0;
}
위 코드에서 greet 함수는 void로 선언되었지만 int로 정의되어, 컴파일 시 다음과 같은 오류가 발생합니다.
conflicting types for ‘greet’
이 문제를 해결하려면 선언과 정의의 타입을 일치시켜야 합니다.
#include <stdio.h>
void greet();
void greet() {
printf("Hello!\n");
}
정상적으로 컴파일되며, 출력 결과는 다음과 같습니다.
Hello!
● 실전 팁
- 함수를 선언할 때와 정의할 때 반드시 동일한 반환형과 매개변수를 유지하세요.
- 함수 선언부를 헤더 파일로 분리하면, 실수로 타입을 바꾸는 것을 방지할 수 있습니다.
- 컴파일러의 경고 메시지에서 충돌이 발생한 줄과 원래 선언된 줄을 함께 확인하세요.
함수의 선언과 정의는 반드시 일관되게 작성되어야 하며, 타입의 불일치는 컴파일러 입장에서 전혀 다른 함수로 인식될 수 있으므로 주의가 필요합니다.