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)처럼 작성하는 것이 좋은 습관입니다.