C++에서는 함수 오버로딩 기능을 사용할 수 있습니다. 이 기능을 사용하여 같은 이름의 함수를 만들 수 있습니다. 유일한 차이점은 인수 유형과 인수 수입니다. 반환 유형은 여기에서 고려되지 않습니다. 이제 문제는 C++가 개체 코드에서 오버로드된 함수를 구별하는 방법입니다.
개체 코드에서 인수에 대한 정보를 추가하여 이름을 변경합니다. 여기에 적용된 기술을 Name Mangling이라고 합니다. C++에는 이름 맹글링에 대한 표준화된 기술이 없습니다. 따라서 컴파일러마다 다른 기술을 사용합니다.
다음은 이름 맹글링의 예입니다. 오버로드된 함수의 이름은 func()이고 다른 함수 my_function()이 있습니다.
예시
int func(int x) { return x*x; } double func(double x) { return x*x; } void my_function(void) { int x = func(2); //integer double y = func(2.58); //double }
일부 C++ 컴파일러는 아래와 같이 변경합니다 -
예시
int __func_i(int x) { return x*x; } double __func_d(double x) { return x*x; } void __my_function_v(void) { int x = __func_i(2); //integer double y = __func_d(2.58); //double }
C는 함수 오버로딩을 지원하지 않으므로 C++에서 C 코드를 연결할 때 기호 이름이 변경되지 않았는지 확인해야 합니다. 다음 C++ 코드는 오류를 생성합니다.
예시
int printf(const char *format,...); main() { printf("Hello World"); }
출력
undefined reference to `printf(char const*, ...)' ld returned 1 exit status
이 문제는 printf()의 이름이 컴파일러에 의해 변경되었기 때문에 발생합니다. 그리고 업데이트된 printf() 함수의 정의를 찾지 못합니다. 이 문제를 극복하려면 C++에서 extern "C"를 사용해야 합니다. 이 블록 내에서 일부 코드가 사용되면 C++ 컴파일러는 함수 이름이 맹글링되지 않도록 합니다. 따라서 이름은 변경되지 않습니다. 따라서 위의 코드는 이 문제를 해결하기 위한 것입니다.
예시
extern "C" { int printf(const char *format,...); } main() { printf("Hello World"); }
출력
Hello World
참고: 이러한 코드 블록은 다른 컴파일러에서 다른 결과를 생성할 수 있습니다.