>  기사  >  백엔드 개발  >  C++의 이름 혼동 및 extern "C"

C++의 이름 혼동 및 extern "C"

WBOY
WBOY앞으로
2023-08-29 10:21:111254검색

名称混淆和extern "C"在C++中

C++에서는 함수 오버로딩 기능을 사용할 수 있습니다. 이 기능을 사용하면 동일한 이름을 가진 함수를 만들 수 있습니다. 유일한 차이점은 매개변수 유형과 매개변수 수입니다. 여기서는 반환 유형을 고려하지 않습니다. 이제 문제는 C++가 대상 코드에서 오버로드된 함수를 어떻게 구별하는가입니다.

타겟 코드에서는 매개변수에 대한 정보를 추가하여 이름을 변경합니다. 여기에 적용된 기술을 이름 맹글링(name mangling)이라고 합니다. C++에는 표준화된 이름 변경 기술이 없습니다. 따라서 서로 다른 컴파일러는 서로 다른 기술을 사용합니다.

아래는 이름 맹글링의 예입니다. 오버로드된 함수의 이름은 func()이며, 또 다른 함수 my_function()이 있습니다.

Example

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++ 컴파일러에서는 아래와 같이 변경됩니다. -

Example

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++ 코드는 오류를 생성합니다.

Example

int printf(const char *format,...);
main() {
   printf("Hello World");
}

Output

undefined reference to `printf(char const*, ...)'
ld returned 1 exit status

문제는 컴파일러가 printf()의 이름을 변경했기 때문에 발생합니다. 그리고 printf() 함수의 업데이트된 정의를 찾지 못합니다. 이 문제를 해결하려면 C++에서 extern "C"를 사용해야 합니다. C++ 컴파일러는 이 블록 내에서 일부 코드가 사용될 때 함수 이름이 손상되지 않도록 보장합니다. 그러면 이름이 바뀌지 않습니다. 따라서 위의 코드는 이 문제를 해결하기 위해 다음과 같이 보일 것입니다.

Example

extern "C" {
   int printf(const char *format,...);
}
main() {
   printf("Hello World");
}

Output

Hello World

참고: 이 코드 블록은 다른 컴파일러에서 다른 결과를 생성할 수 있습니다.

위 내용은 C++의 이름 혼동 및 extern "C"의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 tutorialspoint.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제