2016-11-21 14 views
4

wint_t 유형은 __WINT_TYPE__이 기본적으로 컴파일러에 이미 정의되어 있다는 것을 사용하여 stddef.h을 통해 wchar.h을 통해 설정됩니다. 그래서 우리는 wchar.h"C++ mangling과의 호환성"이란 무엇입니까?

#undef __WINT_TYPE__ 
#define __WINT_TYPE__ wchar_t 
#define WEOF (-1) 

그러나 this 주석의 시작에서 다음 코드를 사용할 수 있습니다

typedef wchar_t wint_t; 

typedef unsigned int wint_t; 

을 변경하는 제안이이 "맹 글링 ++ C에 대한 휴식 호환성"을하고 .

당신은 당신이 동일한 크기와 부호의이 그래서 기본 유형 휴식 호환성을 변경, C에 대한 ABI 호환 경우에도 (ABI 호환성을 깨지 않고 같은 wint_t과 같은 형식 정의의 정의를 기존 변경할 수 없습니다 C++ mangling).

그래서 왜이 typedef를 변경할 수 없으며 "C++ mangling과의 호환성"은 무엇입니까? Application Binary Interface

  • Name Mangling
  • 이름 맹 글링은 컴파일이 방법 -을 나타내는 방법입니다

    +0

    C++에서'wchar_t'는 분리형입니다 – Danh

    +0

    즉, C 링키지의 함수에는 맹 글링의 유형이 포함되어 있지 않으므로 그러한 변경이 C++과 관련된 모든 것에 어떻게 영향을 줄 수 있는지 잘 모르겠습니다. 또한 [diff.wchar.t]을 참고하십시오; 그러한 typedef는 C++에 노출되지 않습니다. –

    답변

    5

    그래서 여기에 몇 가지 관련 정의를 참조하십시오 C++에서 정의한 이름으로 "클래스 별"자격을 얻습니다. 예를 들어 ClassA::method()ClassB::method()과 충돌하지 않습니다. 이렇게하면 ClassA::method(String s)ClassA::method(int i)과 충돌하지 않도록 오버로드가 원활 해집니다. ClassA_method 같은

    내부적으로 이러한 표현 될 수있는 무언가, ClassA_method^String, ClassA_method^int

    두 번째 주제는 위의 설명으로 "이름 맹 글링은 단순히 컴파일러의 내부 문제가 아니다"- 경우에 경우 공유를위한 공용 인터페이스 라이브러리가 생성되고 있습니다.

    따라서 typedef를 가져 와서 자신의 코드로 변경하면 생성하는 모든 이진 파일에서 괜찮지 만이 typedef에 의존하는 타사 DLL과 같은 기존 바이너리는 중단됩니다.

    2

    나는 맹 글링이 무엇인지 알고 있다고 생각합니다. 좋은 설명이 없다면 here입니다.

    또한 호환성으로 인해 다양한 컴파일러와 관련이 있다고 가정합니다. 필자는 Keil과 같은 특정 ARM 컴파일러가 이름 변환과 관련하여 표준 GCC 및 Clang과 데스크톱/서버에서 다르게 처리한다는 것을 알고 있습니다.

    보통은 this처럼 기록됩니다.

    사용자가 특정 유형을 변경하면 특정 시스템에서 이름 변환을위한 컴파일러 기본 매핑을 해제 할 수 있습니다.

    3

    C와 C++을 섞으면 또 다른 경우입니다. 이 질문은 존재하지 않는 "C/C++"언어에서만 의미가 있습니다.

    C에서 이름 맹 글링은 거의 발생하지 않으며 표준 ABI에는 유형 이름이 포함되지 않습니다. 따라서 wchar_t의 실제 이름은 무엇이나 상관 없습니다.

    C++에서 wchar_t은 typedef가 아닙니다.