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
참고: 이 코드 블록은 다른 컴파일러에서 다른 결과를 생성할 수 있습니다.
위 내용은 C++의 이름 혼동 및 extern 'C'의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!