이 C/C++ 함수 호출 퍼즐은 C와 C++ 두 프로그래밍 언어에서 함수(메서드) 호출이 어떻게 다르게 동작하는지 깊이 있게 살펴보기 위해 만들어진 문제입니다.
흥미롭게도 동일한 코드라도 C 컴파일러와 C++ 컴파일러가 해석하는 방식이 다르기 때문에 실행 결과가 달라질 수 있습니다. 그렇다면 C와 C++에서 함수를 호출할 때 어떤 차이가 있는지 예제를 통해 확인해 보겠습니다.
예제 코드
void method() {
// 출력문
}
int main() {
method();
method(2);
}실행 결과
C++의 경우 −
Error : too many arguments to function 'void method()'
C의 경우 −
프로그램이 오류 없이 정상적으로 실행됩니다.
결과와 오류의 원리
C++ 컴파일러는 매개변수가 없는 함수 method()를 “인자를 하나도 받지 않는 함수”로 엄격하게 해석합니다. 따라서 정의에는 매개변수가 없는데 인자를 전달하면 ‘error: too many arguments to function void func()’와 같은 오류 메시지가 출력됩니다.
반면 C 컴파일러는 매개변수 목록이 비어 있는 함수를 가변 인자(variable argument)를 받을 수 있는 함수로 취급합니다. 이 때문에 C에서는 전달된 인자가 그대로 허용되며, 함수 내부의 코드가 아무런 문제 없이 실행됩니다.
결국 이 퍼즐의 핵심은 두 언어의 컴파일러가 빈 매개변수 목록을 해석하는 방식의 차이에 있습니다. C++는 타입 안정성을 중시하여 빈 괄호를 명확하게 처리하지만, C는 유연성과 하위 호환성을 위해 가변 인자처럼 동작하도록 설계되어 있기 때문입니다.