2010-08-16 3 views

답변

2

중대한 구현 세부 사항입니다. 하지만 내가 아는 대부분의 C++ 컴파일러는 C 함수를 인스턴스가 아닌 C++ 함수와 구별하기 위해 특별한 작업을 시도하지 않습니다. 두 가지 모두에 대한 평범한 구식 cdecl 호출 규칙.

중요한 것은 printf() 같은 함수를 사용하는 CRT 구현이 동일한 공급 업체의 C++ 컴파일러와 마찬가지로 C 컴파일러에서도 사용할 수 있기 때문입니다. 아무도 두 가지 버전을 유지하려고하지 않습니다.

+0

참고로 'extern "C"의 인수는 어떻게됩니까? – cHao

+1

@cHao 연산자 오버로드를 지원하기 위해 C++이 수행하는 이름 변환을 중지합니다. 컴파일러에 의해 생성 된 어셈블리에서'foo (int)'와'foo (double)'는'foo_int'와'foo_double'로 변환 될 수 있지만'extern "C"foo (int) "와'extern"C "foo double)'둘 다 간단히'foo'로 번역한다. –

+0

링커에서 볼 수있는 식별자의 이름을 바꾼다. C++ 이름 변환을 끕니다. 모든 전통적인 CRT 함수는 C++ 컴파일러에서 볼 수있는 선언에서 extern "C"입니다. –

3

C++ 컴파일러는 '올바른 일을 함'하고 C 함수에 올바른 호출 규칙을 사용합니다. 불만스러운 응답이지만 너무 많은 것을 말할 수는 없습니다.