이 오류는 C언어에서 조건 연산자(?:) 사용 시 두 피연산자의 타입이 서로 호환되지 않을 때 발생합니다.
C언어에서는 삼항 연산자의 두 결과 값이 동일하거나 변환 가능한 타입이어야 하며, 서로 호환되지 않는 경우 컴파일러는 타입 불일치로 오류를 발생시킵니다.
특히 포인터 타입이 다를 경우(예: int*와 char*), 또는 포인터와 다른 타입이 혼합될 경우 문제가 발생합니다.
● 오류 예제
#include <stdio.h>
int main() {
int x = 1;
int a = 10;
char* msg = x ? (char*)&a : "error"; // 오류: int*를 char*로 변환 시도
return 0;
}
컴파일 시 다음과 같은 오류 메시지를 출력합니다.
error: pointer type mismatch in conditional expression
※ 참고: "error"는 char[6] 타입(배열)로 정의되지만, 삼항 연산자 사용 시 자동으로 char*로 변환(decay)되므로 문제는 없습니다. 문제는 &a가 int* 타입이라 호환되지 않는다는 점입니다.
● 해결 방법
조건 연산자 사용 시 결과로 나오는 두 타입을 일치시키거나, 명시적 형 변환을 통해 통일해야 합니다. 예를 들면 공통 기반 타입인 void*를 사용할 수 있습니다.
#include <stdio.h>
int main() {
int x = 1;
int a = 10;
void* msg = x ? (void*)&a : (void*)"error"; // void*로 통일
return 0;
}
출력은 없지만 위 코드는 타입이 일치하여 정상적으로 컴파일됩니다.
● 실전 팁
- 조건 연산자 결과 타입은 반드시 동일하거나 호환 가능한 타입이어야 합니다.
- 포인터 타입이 다를 경우 void* 같은 중립적인 타입으로 변환하세요.
- 명시적 형변환은 오류 방지에는 도움이 되지만, 실제 메모리 해석 시 타입 일치 여부를 항상 주의해야 합니다.
C언어에서 삼항 연산자는 매우 편리하지만 타입 불일치에 민감합니다. 항상 두 결과 타입이 정확히 일치하도록 설계해야 안전하고 오류 없는 코드를 작성할 수 있습니다.