스택큐힙리스트

C++에서 extern "C"의 효과는 무엇인가요? 본문

카테고리 없음

C++에서 extern "C"의 효과는 무엇인가요?

스택큐힙리스트 2023. 3. 27. 09:41
반응형

C++ 코드에 extern C을 넣는 것이 정확히 무엇을 하는 것인가요?

예를 들면:

extern C {

void foo();

}

답변 1

extern C는 C++에서 함수 이름이 C 링크 작업과 관련하여 C 연결(컴파일러가 이름을 바꾸지 않음)을 갖도록 만들어줍니다. 그렇게 하면 클라이언트 C 코드는 함수 선언만을 포함하는 C 호환 헤더 파일을 사용하여 함수를 링크(사용) 할 수 있습니다. 함수 정의는 C++ 컴파일러에 의해 컴파일 된 이진 형식으로 구성되며, 해당 이진 형식은 클라이언트 C 링커가 C 이름을 사용하여 링크합니다.

C++은 함수 이름 오버로딩을 지원하지만 C는 그렇지 않기 때문에 C++ 컴파일러는 함수 이름을 고유 식별자로 사용할 수 없습니다. 따라서 인자 정보를 추가하여 이름을 변경합니다. 반면, C 컴파일러는 함수 이름을 변경할 필요가 없습니다. C++에서 함수가 extern C 연결(링크)을 갖는다고 선언하면, C++ 컴파일러는 링크에 사용되는 이름에 인자/매개변수 유형 정보를 추가하지 않습니다.

그냥 알아두세요, 각각의 선언/정의에 extern C 연결을 명시적으로 지정하거나 특정 연결을 가지는 선언/정의 시퀀스를 그룹화하기 위해 블록을 사용할 수 있습니다.

extern C void foo(int);

extern C

{

void g(char);

int i;

}

만약 기술적인 부분에 신경 쓰신다면, C++03 표준의 7.5 섹션에서 나열되어 있습니다. 여기 간략한 요약이 있습니다 (여기서는 extern C 에 중점을 둡니다):

extern C은 연결 사양입니다.

모든 컴파일러는 C 링크를 제공해야합니다.

연결 사양은 이름 공간 범위에서만 발생해야합니다.

모든 함수 형식, 함수 이름 및 변수 이름은 언어 링크를 가지고 있습니다. 외부링크를 가진 함수 이름과 변수 이름만 언어 링크를 가집니다.

언어 연결성이 다른 두 함수 유형은 그렇지 않더라도 동일한 경우에도 다른 유형입니다.

링크 스펙스 네스트, 안쪽 스펙이 최종 링크를 결정합니다.

extern C은 클래스 멤버들에게 무시됩니다.

특정 이름의 함수는 하나의 C 링크만 가질 수 있습니다(네임스페이스와 관계없이).

extern C은 함수가 외부 링커지지를 강제합니다(정적으로 만들 수 없습니다) Richard's comment: #$# ic inside은 extern C 안에 있습니다; 이렇게 선언된 개체는 내부 링크를 가지므로 언어 링크가 없습니다.

C++에서 다른 언어로 정의된 객체 및 다른 언어에서 C++로 정의된 객체로의 연결은 구현에 따라 언어에 따라 다릅니다. 두 언어 구현의 객체 레이아웃 전략이 충분히 유사한 경우에만 이러한 연결이 가능합니다.

답변 2

extern C은 C++에서 사용하는 기능 중 하나입니다. 이 기능은 C++ 소스 코드를 C 소스 코드와 호환 가능하게 만들어주는 역할을 합니다. 이번 글에서는 extern C의 역할과 C++에서의 사용 방법, 그리고 그의 효과에 대해서 알아보도록 하겠습니다.

처음에 말씀드린 것처럼 extern C은 C++에서의 기능 중 하나입니다. 이 기능은 우리가 C++ 소스 코드를 작성할 때, 함수의 이름, 매개 변수, 반환 값 등이 C++의 메커니즘에 따라서 해석됩니다. 그러나 이 함수를 C 소스 코드에 사용하고 싶을 때는 함수 이름, 매개 변수, 반환 값 등이 C 소스 코드의 메커니즘에 따라서 이루어져야 합니다. 이 때 extern C가 필요합니다.

extern C를 사용하면 C++ 소스 코드의 함수 이름과 매개 변수, 반환 값을 C 소스 코드의 메커니즘에 맞게 변환하기 때문입니다. 이를 통해 C++ 소스 코드와 C 소스 코드를 혼합하여 사용할 수 있게 됩니다. 이러한 특징 때문에, extern C는 C++와 C 소스 코드로 이루어진 라이브러리를 개발할 때 자주 사용됩니다.

extern C는 사용 방법도 간단합니다. 함수를 선언할 때 extern C를 붙여주기만 하면 됩니다. 예를 들어, extern C void func_name(int parameter);와 같이 함수를 선언할 수 있습니다.

이번에 이야기할 것은 extern C의 효과입니다. C++으로 구현된 함수를 C 소스 코드에서 호출할 때, extern C를 사용하면 함수네임 매핑(name mangling)이 일어나지 않습니다. 함수네임 매핑이란, C++에서 함수를 선언할 때, 함수 이름, 반환 값을, 매개 변수의 개수 및 타입 등을 조합해 고유한 이름을 생성하는 것입니다. 이 때문에 C++와 C 소스 코드가 혼합되면서 함수 호출 시점에 매우 복잡한 링킹 단계를 거쳐야 합니다.

하지만 extern C를 사용하면 링킹과정에서의 함수네임 매핑을 생략할 수 있습니다. 따라서 C 소스 코드에서 C++로 구현된 함수를 호출할 때, 이러한 함수네임 매핑 오류가 발생하지 않습니다.

결론적으로, extern C는 C++ 소스 코드와 C 소스 코드를 혼합하여 사용할 때 매우 유용한 기능입니다. 이 기능을 사용하면 함수 이름, 반환 값, 매개 변수 등이 C 소스 코드의 메커니즘에 맞게 변환됩니다. 이러한 변환으로 인해 C++ 소스 코드가 C 소스 코드와 호환성을 가지게 되며, 함수 호출 시 링킹과정에서의 함수네임 매핑 오류가 발생하지 않습니다. 이로써, C++로 개발된 라이브러리를 C 소스 코드에서도 쉽게 사용할 수 있게 됩니다.

반응형
Comments