extern “C”

많은 C/C++헤더 파일 에서 extern"C"{}에 포 함 된 코드 를 자주 볼 수 있 습 니 다.이 문법 은 C 와 C+코드 를 호 환 하기 위해 존재 한다.겸용C++C 는 원래 호 환 되 는 거 아니에요?확실히 문법 차원 에서 C++는 거의 모든 C 문법 을 지원 합 니 다.그러나 이 호 환 은 대상 파일 이나 라 이브 러 리 등급 의 호 환 으로 두 가지 상황 에서 의 호 환 을 포함한다.하 나 는 C+코드 에 존재 하 는 C 코드 로 작 성 된 라 이브 러 리 를 호출 하 는 것 입 니 다.다른 하 나 는 C 를 사용 하여 코드 를 작성 하 는 것 입 니 다.이 코드 들 이 C++를 호출 할 수 있 기 를 바 랍 니 다.extern"C"에 대해 계속 토론 하려 면 name mangling 을 언급 해 야 합 니 다.C,C++지원 함수 재 부팅,네 임 스페이스 지원,지원 클래스 및 구성원 함수 에 비해 알 고 있 습 니 다.함수 재 부팅 은 이름 이 같은 매개 변수 가 다른 함수,네 임 스페이스(namespace)와 클래스 이름(또는 기호)이 서로 다른 도 메 인 을 구분 하여 서로 다른 도 메 인 에서 똑 같은 이름 을 사용 할 수 있 도록 합 니 다.이러한 특성 을 실현 하기 위해 C++는 name mangling 을 사 용 했 습 니 다.즉,C++컴 파일 러 는 C+파일 을 컴 파일 할 때 모든 함수 이름 을 함수 가 있 는 도 메 인,매개 변수 유형,호출 약속 과 관련 된 다른 이름 으로'어 셈 블 리 단계 의 코드 에서 모든 기 호 는 같은 도 메 인 에 있 기 때 문'이 라 고 한다.C 에 이러한 특성 이 존재 하지 않 기 때문에 보통 C 컴 파 일 러 는 기 호 를 mangling 하지 않 는 다.C++에 이러한 mangling 이 존재 하기 때문에 C 와 C++는 기호 적 으로 일치 하지 않 고 직접 호출 할 수 없습니다.예 를 들 어 C 에 이런 함수 가 있 는데,
//~ add.h
int add(int, int);
//~ add.c
int add(int a, int b)
{
    return a + b;
}

gcc 를 사용 하여 add.c 를 컴 파일 합 니 다.그리고 C++코드 에서 add 함 수 를 직접 호출 합 니 다.
//~ main.cpp
#include <add.h>
int main()
{
    int a = add(0, 1);
    return 0;
}

이렇게 main.cpp 를 컴 파일 합 니 다.
$ gcc -c add.c
$ g++ -c main.cpp
$ g++ main.o add.o -o main
main.o: In function `main':
main.cpp:(.text+0x13): undefined reference to `add(int, int)'
collect2: ld returned 1 exit status

오류 알림 add(int,int)를 찾 을 수 있 습 니 다.main.cpp 를 어 셈 블 리 로 컴 파일 한 후,add 를 호출 하 는 코드 를 보십시오.
movl    $1, %esi #     
    movl    $0, %edi #     
    call    _Z3addii #   add,     
    movl    %eax, -4(%rbp) #      int a

이러한 상황 을 해결 하 는 방법 은 extern"C"를 사용 하 는 것 입 니 다.add.h 에서 add 의 성명 을 extern"C"{}에 넣 는 것 입 니 다.이렇게 하면 g++는 add 에 대해 mangling 을 하지 않 고 링크 기 는 add.o 에서 add 를 찾 아 main.o 로 연 결 됩 니 다.보통 C 코드 의 헤더 파일(libc 의 헤더 파일,예 를 들 어 string.h 포함)에서 함수 의 성명 은 보통 이 렇 습 니 다.
//~ add.h
#ifdef __cplusplus
extern "C" {
#endif
int add(int, int);
#ifdef __cplusplus
}
#endif

이렇게 되면 C 코드 에 add.h 가 포함 되 어 있다 면 add 함 수 를 직접 포함 하 는 성명 입 니 다.C++코드 가 add.h 를 포함 하면 extern"C"가 도 입 됩 니 다.name mangling 에 대해 서 는 여기,그리고 여기 참고 하 세 요.

좋은 웹페이지 즐겨찾기