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

C에서는 되고 C++에서는 안 되는 함수 호출 퍼즐

C와 C++는 여러 면에서 매우 유사한 언어입니다. C++에는 객체 지향 기능이 추가되어 있지만, 대부분의 C 프로그램은 C++에서도 문제없이 컴파일되고 실행됩니다. 그런데 이번에 소개할 프로그램은 C에서는 정상적으로 동작하지만, C++에서는 컴파일 오류가 발생하는 흥미로운 사례입니다.

예제 코드

#include<stdio.h>
void myFunction() {
    printf("Function called\n");
}
int main() {
    myFunction();
    myFunction(2);
}

실행 결과

Function called
Function called

이 프로그램을 C 컴파일러로 컴파일하면 아무 문제 없이 실행되며 위와 같은 결과를 출력합니다. 하지만 같은 코드를 C++ 컴파일러로 컴파일하면 컴파일 시점에 오류가 발생하면서 "too many arguments(너무 많은 인자가 전달됨)"라는 메시지가 출력됩니다.

왜 이런 차이가 발생할까요?

핵심은 두 언어가 비어 있는 매개변수 목록을 해석하는 방식이 서로 다르다는 점입니다.

  • C 언어의 경우: 전통적인 C 표준(C89, C99 등)에서는 void myFunction()처럼 매개변수 목록이 비어 있으면 "인자의 개수와 타입이 아직 정해지지 않았다"는 의미로 해석됩니다. 따라서 myFunction(2)처럼 임의의 인자를 전달해도 컴파일러가 오류로 판단하지 않습니다.
  • C++의 경우: void myFunction()은 엄격하게 "매개변수를 하나도 받지 않는 함수"를 의미합니다. 따라서 인자를 하나라도 전달하면 즉시 컴파일 오류가 발생합니다.

참고로 최신 C 표준(C23)부터는 이 규칙이 변경되어 C++과 마찬가지로 빈 괄호가 "매개변수 없음"을 의미하게 되었습니다. 만약 C에서도 인자 없음을 명확히 표현하고 싶다면 void myFunction(void)처럼 작성하는 것이 좋은 습관입니다.