Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C와 C++ 간의 비호환성: C 코드가 C++에서 컴파일되지 않는 이유

C는 C++의 기반이 된 언어이지만, 두 언어가 완전히 호환되는 것은 아닙니다. C 컴파일러에서는 정상적으로 컴파일되던 코드가 C++ 컴파일러에서는 오류를 발생시키는 경우가 있습니다. 이 글에서는 C와 C++ 사이의 대표적인 비호환성 사례들을 살펴보고, 각각이 왜 다르게 동작하는지 알아보겠습니다.

1. 구식 함수 정의 방식 (K&R 스타일)

구식 C 문법에서는 매개변수 목록 뒤에 매개변수의 타입을 별도로 지정하는 방식으로 함수를 정의할 수 있었습니다. 하지만 이 방식은 C++에서 유효하지 않습니다.

예제 코드

#include<stdio.h>
void my_function(x, y)int x;int y; { // C++에서는 유효하지 않음
   printf("x = %d, y = %d", x, y);
}
int main() {
   my_function(10, 20);
}

C 실행 결과

x = 10, y = 20

C++ 실행 결과

Error in C++ :- x and y was not declared in this scope

2. 변수 타입 생략 시 기본형(int) 처리 차이

C나 일부 구버전 C++에서는 변수의 타입을 명시하지 않으면 기본적으로 int로 간주했습니다. 그러나 최신 C++에서는 타입을 생략하면 컴파일 오류가 발생합니다.

예제 코드

#include<stdio.h>
main() {
   const x = 10;
   const y = 20;
   printf("x = %d, y = %d", x, y);
}

C 실행 결과

x = 10, y = 20

C++ 실행 결과

Error in C++ :- x does not name a type
y does not name a type

3. extern 없이 전역 변수 중복 선언

C에서는 extern 키워드 없이도 전역 데이터 객체를 여러 번 선언할 수 있으며, C 컴파일러는 여러 번의 선언을 하나로 취급합니다. 반면 C++에서는 재정의(redefinition) 오류로 처리됩니다.

예제 코드

#include<stdio.h>
int x;
int x;
int main() {
   x = 10;
   printf("x = %d", x);
}

C 실행 결과

x = 10

C++ 실행 결과

Error in C++ :- Redefinition of int x

4. void 포인터의 암묵적 변환

C에서는 void 포인터를 할당문의 우측 피연산자로 사용하여 어떤 포인터 타입의 변수든 초기화할 수 있습니다. 즉, 명시적인 형 변환(cast) 없이 암묵적으로 변환됩니다. 하지만 C++에서는 안전성을 위해 명시적 형 변환을 요구하며, 암묵적 변환 시 오류가 발생합니다.

예제 코드

#include<stdio.h>
#include<malloc.h>
void my_function(int n) {
   int* ptr = malloc(n* sizeof(int)); // void*를 int*로 암묵적 변환
   printf("Array created. Size: %d", n);
}
main() {
   my_function(10);
}

C 실행 결과

Array created. Size: 10

C++ 실행 결과

Error in C++ :- Invalid conversion of void* to int*

5. 매개변수가 없는 함수에 인자 전달

C에서는 함수 정의 시 매개변수 타입이 지정되지 않은 경우, 호출 시 여러 개의 인자를 전달해도 컴파일러가 이를 허용합니다. 반면 C++에서는 매개변수 목록이 비어 있는 함수는 인자를 받지 않는 것으로 해석되므로, 인자를 전달하면 오류가 발생합니다.

예제 코드

#include<stdio.h>
void my_function() {
   printf("Inside my_function");
}
main() {
   my_function(10, "Hello", 2.568, 'a');
}

C 실행 결과

Inside my_function

C++ 실행 결과

Error in C++ :- Too many arguments to function 'void my_function()'

정리

위에서 살펴본 것처럼 C와 C++은 문법적으로 유사해 보이지만, 타입 검사의 엄격함과 언어 설계 철학의 차이로 인해 서로 완전히 호환되지 않습니다. 특히 C++은 더 엄격한 타입 시스템을 채택하고 있기 때문에, C 스타일로 작성된 레거시 코드를 C++ 프로젝트에 통합할 때는 위와 같은 비호환성 요소들을 반드시 확인하고 수정해야 합니다.