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

C++에서는 컴파일되지 않는 C 프로그램 작성 방법

C++은 C의 후속 언어로, C의 모든 기능을 포함하고 C 코드와의 호환성을 갖추고 있다고 알려져 있습니다. 하지만 실제로는 C에서는 정상적으로 동작하던 코드가 C++ 컴파일러로 컴파일하면 오류가 발생하는 경우가 존재합니다. 이번 글에서는 C++에서 컴파일되지 않는 대표적인 C 프로그램 사례들을 살펴보겠습니다.

1. 함수 선언 전 호출

C++에서는 함수를 선언하기 전에 호출하면 컴파일 오류가 발생합니다. 반면 C에서는 함수가 파일 내 어딘가에 정의되어 있으면 선언 없이 호출해도 문제없이 동작합니다.

예제

#include <stdio.h>
int main(){
    printHello();
    return 0;
}
void printHello(){
    printf("TutorialsPoint");
}

실행 결과 (C)

TutorialsPoint

C++ 컴파일러로 이 코드를 빌드하면 'printHello' 식별자를 찾을 수 없다는 오류가 발생합니다. C++은 타입 안정성을 중시하기 때문에 함수 원형(프로토타입)이 반드시 먼저 선언되어야 하기 때문입니다.

2. void 포인터를 타입 변환 없이 사용

C에서는 void* 포인터를 다른 자료형의 포인터에 암묵적으로 대입할 수 있습니다. 그러나 C++에서는 명시적인 타입 캐스팅이 필수이며, 캐스팅 없이 대입하면 컴파일 오류가 발생합니다.

예제

#include <stdio.h>
int main(){
    void *ptr;
    int *ptr2 = ptr; // C++에서는 오류 발생
    return 0;
}

C++에서 이 코드를 컴파일하려면 int *ptr2 = (int *)ptr;처럼 명시적 형변환이 필요합니다.

3. 초기화하지 않은 const 변수 선언

C에서는 상수(const) 변수를 값을 지정하지 않고 선언할 수 있으며, 컴파일도 정상적으로 수행됩니다. 하지만 C++에서는 const 변수를 선언과 동시에 반드시 초기화해야 하며, 그렇지 않으면 컴파일 오류가 발생합니다.

예제

#include <stdio.h>
int main(){
    const int x; // C++에서는 오류 발생
    printf("%d", x);
    return 0;
}

실행 결과 (C)

0

C에서는 초기화되지 않은 const 변수가 기본값 0으로 처리될 수 있지만, C++에서는 이러한 선언 자체가 허용되지 않습니다.

4. const 변수에 일반 포인터 연결

C에서는 const로 선언된 변수의 주소를 일반 포인터에 저장하는 것이 허용됩니다. 하지만 C++에서는 const 객체의 주소를 일반(non-const) 포인터에 대입하는 것이 금지되어 있으며, 이를 시도하면 컴파일 오류가 발생합니다.

예제

#include <stdio.h>
int main(void){
    int const x = 3424;
    int *cptr = &x; // C++에서는 오류 발생
    printf("value of pointer : %d\n", *cptr);
    return 0;
}

실행 결과 (C)

Value of pointer: 3424

C++에서 올바르게 작성하려면 const int *cptr = &x;처럼 const 포인터를 사용해야 합니다.

5. C++ 예약어를 변수 이름으로 사용

C 언어에는 존재하지 않지만 C++에는 새롭게 추가된 키워드들이 있습니다. 이러한 키워드들은 C에서는 일반 변수 이름으로 사용해도 컴파일되지만, C++에서는 예약어이기 때문에 변수명으로 사용할 수 없습니다.

예제

#include <stdio.h>
int main(void){
    int class = 5; // C++에서는 오류 발생
    printf("%d", class);
}

실행 결과 (C)

5

class 외에도 new, delete, explicit, template, namespace, this, virtual 등의 키워드가 C++에 추가되었기 때문에, C 코드에서 이들을 변수명으로 사용했다면 C++로 마이그레이션할 때 반드시 수정해야 합니다.

정리

위에서 살펴본 것처럼 C++은 C와 높은 호환성을 가지지만 완전히 동일하지는 않습니다. 함수 프로토타입 선언, void 포인터의 명시적 형변환, const 변수의 초기화 의무, const 주소를 담는 포인터의 타입 제한, 그리고 새로 도입된 예약어 등의 차이점 때문에 C에서 잘 컴파일되던 코드가 C++에서는 오류를 일으킬 수 있습니다. 따라서 기존 C 코드를 C++ 환경으로 옮길 때는 이러한 차이점을 반드시 점검해야 합니다.