외부 변수를 전역 변수라고도 합니다. 이러한 변수는 함수 외부에 정의됩니다. 이러한 변수는 함수 실행 전체에서 전역적으로 사용할 수 있습니다. 전역 변수의 값은 함수에 의해 수정될 수 있습니다. “extern” 키워드는 외부 변수를 선언하고 정의하는 데 사용됩니다. C++ 코드에서 익숙하지 않거나 못생긴 것처럼 보일 수 있습니다. 그러나 모든 C 헤더에서 #ifdefs 둘러싸인 선언을 갖는 것보다 여전히 좋습니다. 또한 C 헤더를 둘러싸는 것을 잊어 버릴 때 찾기 어려운 링커 오류가 발생할 수 있습니다. C++ 코드와 달리 C 코드는 포인터가 정확히 동일한 형식이 아니면 두 포인터가 동일한 개체를 가리키도록 알 수 없습니다. 예를 들어 C++에서는 파생*이 bp라고 하는 Base*가 가리키는 것과 동일한 개체를 dp 가리키는지 쉽게 확인할 수 있습니다.

C++ 컴파일러는 두 포인터를 동일한 유형으로 자동으로 변환하며, 이 경우 Base*로 변환한 다음 비교합니다. C++ 컴파일러의 구현 세부 정보에 따라 이 변환은 경우에 따라 포인터 값의 비트를 변경합니다. 다음으로 모듈에 있는 동안 클래스 팩터리 함수라고 하는 두 개의 추가 도우미 함수를 정의합니다. 이러한 함수 중 하나는 클래스의 인스턴스를 만들고 포인터를 반환합니다. 다른 함수는 팩터리에서 만든 클래스에 대한 포인터를 가져와 서 삭제합니다. 이 두 함수는 외종 “C”로 정규화됩니다. 요점은 간단합니다 : C 컴파일러는 포인터 변환을 수행하는 방법을 알지 못하므로 Derived *에서 Base *로의 변환은 C 컴파일러로 컴파일 된 코드가 아닌 C + + 컴파일러로 컴파일 된 코드에서 수행되어야합니다. 그렇다고 해서 외종 “C”로 정규화된 함수에 C++ 코드를 포함할 수 없다는 의미는 아닙니다.

이러한 함수는 C++ 기능을 사용하고 모든 유형의 인수를 취할 수있는 모든 기능을 갖춘 C ++ 함수입니다. 외의 “C”는 컴파일러에만 표시되기 때문에 의도한 대로 작동합니다. 그러나, 그것은 못생긴 이상입니다. 그것은 바람직하지 않은 C ++ 특정 코드와 일반 C 헤더를 감염. C 프로그램에서 다시 사용하려는 라이브러리이기 때문에 일반적으로 C에서 해당 코드를 작성합니다. 외종 변수의 초기화는 외종 변수의 정의로 간주됩니다. 여기서 var이라는 정수 형식 변수가 선언되고 정의되었습니다. (정의는 선언의 수퍼세트라는 것을 기억하십시오). 여기서 var에 대한 메모리도 할당됩니다. 이제 C 함수를 선언 / 정의 할 때 기본적으로 외향적 인 존재가 있음을 알았습니다.

함수를 정의하는 동안 문제없이 extern으로 준비할 수 있습니다. 그러나 C 변수의 경우는 그렇지 않습니다. 외부 의 존재를 변수에 기본값으로 넣으면 메모리가 할당되지 않고 선언됩니다. 따라서 C 변수를 정의하지 않고 선언하려는 경우 C 변수에 대해 extern을 명시적으로 배치합니다. 또한 외부 가문은 전체 프로그램에 대한 가시성을 확장함에 따라 변수와 함께 외형 키워드를 사용하여 프로그램의 어느 곳에서나 변수를 사용할 수 있으며 변수가 어딘가에 정의되어 있습니다. Visual Studio 2017 버전 15.3 이전 버전에서 컴파일러는 변수가 외부로 표시된 경우에도 항상 constexpr 변수 내부 연결을 제공했습니다. Visual Studio 2017 버전 15.5에서 새 컴파일러 스위치(/Zc:externConstexpr)를 사용하면 올바른 표준 준수 동작이 가능합니다. 결국 이것은 기본값이 됩니다. 문제의 해결책은 C ++의 외종 “C”입니다.

일부 코드를 외부 “C” 블록에 넣으면 C++ 컴파일러는 함수 이름이 엉키지 않도록 합니다.