C 함수는 왜 이름을 바꿀 수 없습니까?


136

최근에 인터뷰를 extern "C"했고 C ++ 코드에서 무엇이 사용되는지에 대한 질문이있었습니다 . C는 이름 맹 글링을 사용하지 않기 때문에 C ++ 코드에서 C 함수를 사용하는 것이라고 대답했습니다. 나는 왜 C가 이름 맹 글링을 사용하지 않고 정직하게 대답 할 수 없는지 물었다.

C ++ 컴파일러가 함수를 컴파일 할 때 C ++에서 같은 이름의 오버로드 된 함수를 컴파일 타임에 해결해야하기 때문에 함수에 특별한 이름을 부여한다는 것을 이해합니다. C에서 함수 이름은 동일하게 유지되거나 앞에 _가 붙습니다.

내 쿼리는 : C ++ 컴파일러가 C 함수를 맹 글링하도록 허용하는 데 어떤 문제가 있습니까? 컴파일러가 어떤 이름을 제공하는지는 중요하지 않다고 가정했을 것입니다. C와 C ++에서 같은 방식으로 함수를 호출합니다.


75
C는 함수 과부하가 없기 때문에 이름을 맹 글링 할 필요 가 없습니다.
EOF

9
C ++ 컴파일러가 함수 이름을 맹 글링하는 경우 C 라이브러리를 C ++ 코드와 어떻게 연결합니까?
Mat

6
"C가 이름을 엉망으로 사용하지 않기 때문에 C ++ 코드에서 C 함수를 사용하는 것이라고 답했다." -다른 방법이라고 생각합니다. Extern "C"는 C ++ 함수를 C 컴파일러에서 사용할 수있게합니다. 소스
rozina

3
@ Engineer999 : C ++ 컴파일러를 사용하여 C ++ 인 C의 하위 세트를 컴파일하면 함수 이름이 실제로 엉망이됩니다. 그러나 다른 컴파일러로 만든 이진 파일을 연결하려면 이름 맹 글링을 원하지 않습니다.
EOF

13
C 맹글 이름을 사용합니다. 일반적으로 맹 글링 된 이름은 밑줄이 앞에 오는 함수의 이름입니다. 때로는 함수 이름 뒤에 밑줄이 붙습니다. extern "C"C 컴파일러와 같은 방식으로 이름을 맹 글링한다고한다.
피트 베커

답변:


187

그것은 위에서 대답했지만 일종의 맥락에 넣을 것입니다.

먼저 C가 먼저 나왔습니다. 따라서 C가하는 것은 일종의 "기본"입니다. 이름이 틀리기 때문에 이름을 맹 글링하지 않습니다. 기능 명은 기능 명입니다. 글로벌은 글로벌 등입니다.

그런 다음 C ++가 등장했습니다. C ++은 C와 동일한 링커를 사용하고 C로 작성된 코드와 링크 할 수 있기를 원했지만 C ++은 C를 "맨 글링 (mangling)"상태로 남겨 둘 수 없었습니다. 다음 예를 확인하십시오.

int function(int a);
int function();

C ++에서 이들은 고유 한 기능을 가진 고유 한 기능입니다. 이들 중 어느 것도 엉망이 아닌 경우 둘 다 "함수"(또는 "_ 함수")라고하며 링커는 심볼의 재정의에 대해 불평합니다. C ++ 솔루션은 인수 유형을 함수 이름으로 변환했습니다. 따라서 하나는 호출 _function_int되고 다른 하나는 호출됩니다 _function_void(실제 mangling 구성표는 아님).

이제 문제가 생겼습니다. 경우 int function(int a)는 C 모듈에 정의 된, 우리는 단지 코드를 C ++에서 헤더 (즉, 선언)을 복용하고 그것을 사용하고, 컴파일러는 수입에 링커 명령을 생성합니다 _function_int. 함수가 정의되었을 때 C 모듈에서는 호출되지 않았습니다. 호출되었다 _function. 링커 오류가 발생합니다.

이 오류를 피하기 위해 함수를 선언 하는 동안 컴파일러에게 C 컴파일러와 연결되거나 C 컴파일러에 의해 컴파일되도록 설계된 함수라고 알려줍니다.

extern "C" int function(int a);

C ++ 컴파일러는 이제가 _function아닌 가져 오기를 알고 _function_int있으며 모든 것이 좋습니다.


1
@ShacharShamesh : 다른 곳에서이 질문을했지만 C ++ 컴파일 라이브러리에서 링크하는 것은 어떻습니까? 컴파일러가 C ++ 컴파일 라이브러리의 함수 중 하나를 호출하는 코드를 단계별로 컴파일하고 컴파일 할 때 선언이나 함수 호출을 볼 때 어떤 이름을 맹 글링하거나 함수에 부여 할 수 있는지 어떻게 알 수 있습니까? 그것이 정의 된 곳에서 다른 것으로 이름이 얽힌 것을 아는 방법? 따라서 C ++에는 표준 이름 관리 방법이 있어야합니까?
Engineer999

2
모든 컴파일러는 고유 한 방식으로 처리합니다. 동일한 컴파일러로 모든 것을 컴파일하는 경우 중요하지 않습니다. 그러나 볼랜드 컴파일러로 컴파일 된 라이브러리를 마이크로 소프트 컴파일러로 빌드 한 프로그램에서 사용하려고한다면 ... 당신은 그것을 필요로 할 것이다 :)
Mark VY

6
@ Engineer999 휴대용 C ++ 라이브러리와 같은 것이없는 이유가 궁금했지만, C API를 사용하거나 내 보내야하는 컴파일러 (및 표준 라이브러리)의 버전 (및 플래그)을 정확하게 지정 했습니까? 당신은 간다. C ++는 지금까지 발명 된 것 중 가장 이식성이 낮은 언어 인 반면 C는 정반대입니다. 이와 관련하여 노력이 있지만 지금은 진정으로 휴대 가능한 것을 원한다면 C를 고수 할 것입니다.
Voo

1
@Voo 글쎄, 이론적으로는 표준을 준수하는 것만으로 휴대용 코드를 작성할 수 있어야하며 표준 -std=c++11이외의 것을 사용하지 않아야합니다 . 새로운 Java 버전은 이전 버전과 호환되지만 Java 버전을 선언하는 것과 같습니다. 사람들이 컴파일러 특정 확장 및 플랫폼 종속 코드를 사용하는 것은 표준 결함이 아닙니다. 반면에 표준에는 많은 것들 (예 : 소켓과 같은 IO)이 없기 때문에 그들을 비난 할 수 없습니다. 위원회는 천천히 따라 잡고있는 것으로 보인다. 내가 뭔가를 놓친 경우 수정하십시오.
mucaho

14
@ mucaho : 소스 이식성 / 호환성에 대해 이야기하고 있습니다. 즉, API. Voo는 재 컴파일없이 바이너리 호환성 에 대해 이야기하고 있습니다. 여기에는 ABI 호환성 이 필요합니다 . C ++ 컴파일러는 정기적으로 버전간에 ABI를 변경합니다. (예를 들어 g ++은 안정적인 ABI를 가지려고 시도하지도 않습니다. 재미를 위해 ABI를 깨뜨리지 않는다고 가정하지만 얻을만한 것이 있거나 다른 좋은 방법이 없을 때 ABI 변경이 필요한 변경은 피하지 않습니다 할 수 있습니다.).
Peter Cordes

45

그들이 "할 수 없다" 는 것은 아니며 , 일반적으로 그렇지 않습니다 .

C 라이브러리에서이라는 함수를 호출하려면 foo(int x, const char *y)C ++ 컴파일러가 foo_I_cCP()할 수 있기 때문에 C ++ 컴파일러 에서 맹 글링 체계를 구성하는 것이 좋지 않습니다 .

이 이름은 해결되지 않고 함수는 C에 있으며 이름은 인수 유형 목록에 의존하지 않습니다. 따라서 C ++ 컴파일러는 이것을 알아야하고 그 기능을 C로 표시하여 조작을 피합니다.

C 함수는 소스 코드가없는 라이브러리에있을 수 있으며, 미리 컴파일 된 바이너리와 헤더 만 있으면됩니다. 따라서 C ++ 컴파일러는 "자신의 일"을 수행 할 수 없으며 결국 라이브러리의 내용을 변경할 수 없습니다.


이것이 내가 놓친 부분입니다. C ++ 컴파일러가 선언 만 보거나 호출 될 때 함수 이름을 엉망으로 만드는 이유는 무엇입니까? 구현을 볼 때 함수 이름을 맹 글링하지 않습니까? 이것은 나에게 더 의미가 있습니다
Engineer999

13
@ Engineer999 : 정의 이름과 선언 이름을 어떻게 지정할 수 있습니까? "Brian이라는 함수를 호출 할 수 있습니다." "알겠습니다. 브라이언에게 전화하겠습니다." "죄송합니다. Brian이라는 기능이 없습니다." 그것이 Graham이라고합니다.
궤도에서 가벼움 경주

C ++ 컴파일 라이브러리에서 링크는 어떻습니까? 컴파일러가 C ++ 컴파일 라이브러리의 함수 중 하나를 호출하는 코드를 단계별로 작성하고 컴파일 할 때 선언 또는 함수 호출을 볼 때 어떤 이름을 맹 글링하거나 함수에 부여해야하는지 어떻게 알 수 있습니까?
엔지니어

1
@ Engineer999 둘 다 같은 맹 글링에 동의해야합니다. 그래서 그들은 헤더 파일을보고 (네이티브 DLL에는 메타 데이터가 거의 없다는 것을 기억하십시오. 헤더는 그 메타 데이터입니다) "아, 맞아, Brian은 정말로 Graham이어야합니다". 이 방법으로 문제가 해결되지 않으면 (예 : 호환되지 않는 두 개의 맹 글링 구성표 사용) 올바른 링크를 얻지 못하고 응용 프로그램이 실패합니다. C ++에는 이와 같은 많은 비 호환성이 있습니다. 실제로, 맹 글링 된 이름을 명시 적으로 사용하고 사용자 측에서 맹 글링을 비활성화해야합니다 (예 : 코드가 Brian이 아닌 Graham을 실행하도록 지시합니다). 에서 실제 연습 ... extern "C":)
Luaan

1
@ Engineer999 내가 틀렸을 수도 있지만 Visual Basic, C # 또는 Java (또는 심지어 Pascal / Delphi)와 같은 언어에 경험이 있습니까? 그것들은 interop을 매우 단순하게 만듭니다. C와 특히 C ++에서는 그렇지 않습니다. 명심해야 할 많은 호출 규칙이 있으며, 누가 어떤 메모리를 담당하는지 알아야하며, DLL 자체에는 충분한 정보가 포함되어 있지 않기 때문에 함수 선언을 알려주는 헤더 파일이 있어야합니다. pure C. 헤더 파일이 없으면 일반적으로 DLL을 디 컴파일하여 사용해야합니다.
Luaan

32

C ++ 컴파일러가 C 함수를 맹 글링하는 것이 무엇이 잘못 되었습니까?

더 이상 C 함수가 아닙니다.

함수는 단순한 서명과 정의가 아닙니다. 함수의 작동 방식은 주로 호출 규칙과 같은 요소에 의해 결정됩니다. 플랫폼에서 사용하도록 지정된 "응용 프로그램 이진 인터페이스"는 시스템이 서로 통신하는 방법을 설명합니다. 시스템에서 사용중인 C ++ ABI는 이름 관리 체계를 지정하여 해당 시스템의 프로그램이 라이브러리 등에서 함수를 호출하는 방법을 알 수 있도록합니다. (예를 들어 C ++ Itanium ABI를 읽으십시오. 왜 필요한지 매우 빨리 알 수 있습니다.)

시스템의 C ABI에도 동일하게 적용됩니다. 일부 C ABI에는 실제로 이름 관리 체계 (예 : Visual Studio)가 있으므로 특정 기능의 경우 "이름 관리 해제"와 C ++ ABI에서 C ABI 로의 전환에 관한 것이 아닙니다. C 함수를 C 함수로 표시하고 C ++ ABI가 아닌 C ABI가 관련이 있습니다. 선언은 정의와 일치해야합니다 (동일한 프로젝트 또는 일부 타사 라이브러리에서). 그렇지 않으면 선언이 의미가 없습니다. 그렇지 않으면 시스템은 단순히 해당 기능을 찾고 호출하는 방법을 알지 못합니다.

플랫폼이 C 및 C ++ ABI를 동일하게 정의하지 않고이 "문제"를 제거하는 이유는 부분적으로 역사적입니다. 원래 C ABI는 네임 스페이스, 클래스 및 연산자 오버로드가있는 C ++에는 충분하지 않았습니다. 그 중 일부는 컴퓨터 친화적 인 방식으로 심볼 이름으로 표시되어야하지만 C 커뮤니티에서 C 프로그램을 준수하도록 만드는 것은 C 커뮤니티에서 불공평하다고 주장 할 수 있습니다. ABI는 단지 상호 운용성을 원하는 다른 사람들을 위해서입니다.


2
+int(PI/3)하지만, 소금 한 곡물로 : 나는 "C ++ ABI"의 말을 매우 신중 것 ... AFAIK이있다 시도 C ++ ABI를 정의에서는 있지만 실제 사실상 / 법률 상 표준 없습니다 - 같은 isocpp.org/files /papers/n4028.pdf의 상태는 (내가 진심으로 동의), 인용, C ++에서 실제로 항상 ABI-로 통근을 통해 C ++의 C 부분 집합에 의존 "C 바이너리 안정적으로 API를 게시 할 수있는 방법을 지원하는 것을 깊이 아이러니 ”. . C++ Itanium ABI단지이다 - 일부 아이테니엄을위한 C ++ ABI는 ...에 논의 된 바와 같이 stackoverflow.com/questions/7492180/c-abi-issues-list

3
@vaxquis : 예, "C ++의 ABI"가 아니라 "C ++ ABI"와 같은 방식으로 모든 집에서 작동하지 않는 "하우스 키"가 있습니다. 나는 문구와 오프 시작하여 가능한 한 명확로 만들려고하지만 그것이 명확하게 될 수 추측 는 "C ++ ABI 시스템에서 사용 " . 나는 간결하게 설명하기 위해 청징 제를 떨어 뜨 렸지만 여기서 혼동을 줄이는 편집을 받아 들일 것입니다!
궤도에서 가벼운 경주

1
AIUI C abi는 플랫폼의 속성 인 반면 C ++ ABI는 개별 컴파일러의 속성이었으며 종종 개별 버전의 컴파일러의 속성이기도했습니다. 따라서 다른 공급 업체 도구로 구축 된 모듈간에 연결하려면 인터페이스에 C abi를 사용해야했습니다.
plugwash

"이름 얽힌 함수는 더 이상 C 함수가 아닙니다"라는 문구가 과장되었습니다. 맹 글링 된 이름이 알려진 경우 일반 바닐라 C에서 이름 얽힌 함수를 호출하는 것이 완벽하게 가능합니다. 이름이 변경 되어도 C ABI에 대한 준수가 떨어지지 않습니다. 즉, C 함수보다 작게 만들지 않습니다. 다른 방법은 더 의미가 있습니다. C ++ 코드 는 수신자에게 링크하려고 할 때
피터-모니 토 복원 모니카

@ PeterA.Schneider : 예, 제목 문구가 과장되었습니다. 대답의 전체 나머지는 관련 사실적인 세부 사항이 포함되어 있습니다.
궤도에서 가벼움 경주

21

사실 MSVC는 않습니다 간단한 방식으로하지만, 압착 롤러 C 이름을. 때때로 @4또는 다른 작은 숫자를 추가 합니다. 이것은 호출 규칙 및 스택 정리의 필요성과 관련이 있습니다.

따라서 전제는 결함이 있습니다.


2
그것은 실제로 이름 맹 글링이 아닙니다. 이는 단순히 호출 규칙이 다른 함수로 작성된 DLL에 실행 파일 관련 문제가 발생하지 않도록하는 벤더별 이름 지정 (또는 이름 장식) 규칙입니다.
Peter

2
앞에 붙는 것은 _어떻습니까?
OrangeDog

12
@ 피터 : 말 그대로 같은 것.
궤도에서 가벼움 경주

5
@Frankie_C : "Caller cleans stack"은 C 표준에 의해 지정되지 않았습니다 : 언어 관점에서 호출 규칙은 다른 표준보다 더 표준 적이 지 않습니다.
벤 Voigt

2
그리고 MSVC 관점에서 볼 때 "표준 통화 규칙"은 당신이 선택한 것 /Gd, /Gr, /Gv, /Gz입니다. 즉, 함수 호출이 명시 적으로 호출 규칙을 지정하지 않는 한 표준 호출 규칙이 사용됩니다. __cdecl기본 표준 호출 규칙을 생각하고 있습니다.
MSalters

13

부분적으로 C로 작성되고 일부 다른 언어 (종종 어셈블리 언어이지만 때로는 파스칼, FORTRAN 또는 기타)로 작성된 프로그램을 갖는 것이 매우 일반적입니다. 프로그램에 모든 소스 코드가없는 다른 사람들이 작성한 다른 구성 요소가 포함되어있는 것도 일반적입니다.

대부분의 플랫폼에는 특정 유형의 인수를 허용하고 특정 유형의 값을 반환하는 특정 이름을 가진 함수를 생성하기 위해 컴파일러가 수행해야하는 작업을 설명하는 ABI [Application Binary Interface]라는 사양이 있습니다. 경우에 따라 ABI는 둘 이상의 "호출 규칙"을 정의 할 수 있습니다. 이러한 시스템의 컴파일러는 특정 함수에 어떤 호출 규칙을 사용해야하는지 나타내는 수단을 제공합니다. 예를 들어, Macintosh에서는 대부분의 Toolbox 루틴이 Pascal 호출 규칙을 사용하므로 "LineTo"와 같은 프로토 타입은 다음과 같습니다.

/* Note that there are no underscores before the "pascal" keyword because
   the Toolbox was written in the early 1980s, before the Standard and its
   underscore convention were published */
pascal void LineTo(short x, short y);

프로젝트의 모든 코드가 동일한 컴파일러를 사용하여 컴파일 된 경우 컴파일러가 각 함수에 대해 내 보낸 이름은 중요하지 않지만 많은 상황에서 C 코드가 다른 도구를 사용하여 컴파일 된 함수를 호출해야합니다. 현재 컴파일러로 다시 컴파일 할 수 없으며 C에도 없을 수도 있습니다. 따라서 링커 이름을 정의 할 수있는 기능은 이러한 기능을 사용하는 데 중요합니다.


네, 그게 답입니다. 그것이 단지 C와 C ++라면 그것이 왜 그렇게되는지 이해하기 어렵습니다. 이해하기 위해서는 정적으로 연결하는 오래된 방식의 맥락에서 사물을 배치해야합니다. 정적 연결은 Windows 프로그래머에게는 기본 인 것처럼 보이지만 C 이름을 바꿀 수없는 주된 이유 입니다.
user34660

2
@ user34660 : 퀴즈가 아닙니다. C가 내보낼 수있는 이름을 처리하거나 2 차 특성으로 구별되는 여러 개의 유사한 이름이있는 기호를 허용해야하는 기능의 존재를 강제 할 수 없기 때문입니다.
supercat

그러한 것들을 "관리"하려는 시도가 있었거나 그러한 것들이 C ++ 이전에 C에 사용 가능한 확장명이라는 것을 알고 있습니까?
user34660

@ user34660 : Re "정적 연결은 Windows 프로그래머에게는 기본으로 보입니다 ...", 그러나 동적 연결은 Linux를 사용하는 사람들에게 주요 PITA처럼 보일 수 있습니다. 프로그램 X (아마도 C ++로 작성)를 설치할 때 특정 버전을 추적하고 설치해야 함을 의미합니다 시스템에 이미 다른 버전의 라이브러리가 있습니다.
jamesqf

@ jamesqf, 예, Unix는 Windows 이전에 동적 링크가 없었습니다. 유닉스 / 리눅스에서의 동적 연결에 대해서는 거의 알지 못하지만 일반적으로 운영 체제에서와 같이 매끄럽지 않은 것처럼 들립니다.
user34660

12

다른 접선 토론을 해결하기 위해 다른 답변 하나를 추가하겠습니다.

C ABI (응용 프로그램 이진 인터페이스)는 원래 스택에서 인수를 역순으로 (즉, 오른쪽에서 왼쪽으로 푸시) 전달해야했으며 호출자도 스택 저장소를 비 웁니다. 현대 ABI는 실제로 인수를 전달하기 위해 레지스터를 사용하지만 많은 고민 고려 사항은 원래 스택 인수 전달로 되돌아갑니다.

대조적으로, 원래 파스칼 ABI는 논쟁을 왼쪽에서 오른쪽으로 밀었 고, 수신자는 논쟁을 터뜨려 야했다. 원래 C ABI는 두 가지 중요한 점에서 원래 Pascal ABI보다 우수합니다. 인수 푸시 순서는 첫 번째 인수의 스택 오프셋이 항상 알려져 있으므로 알 수없는 인수 수를 갖는 함수를 허용합니다. 여기서 초기 인수는 다른 인수 수 (ala printf)를 제어합니다 .

C ABI가 우월한 두 번째 방법은 발신자와 수신자가 몇 개의 인수에 동의하지 않는 경우의 동작입니다. C의 경우 실제로 마지막 인수를 지난 인수에 액세스하지 않는 한 나쁜 일이 없습니다. Pascal에서 스택에서 잘못된 수의 인수가 표시되고 전체 스택이 손상되었습니다.

원래 Windows 3.1 ABI는 Pascal을 기반으로했습니다. 따라서 Pascal ABI (왼쪽에서 오른쪽 순서의 인수, 수신자 수신자)가 사용되었습니다. 인수 번호가 일치하지 않으면 스택이 손상 될 수 있으므로 맹 글링 구성표가 형성되었습니다. 각 함수 이름은 인수의 크기를 바이트 단위로 나타내는 숫자로 엉망입니다. 따라서 16 비트 시스템에서 다음 함수 (C 구문)는 다음과 같습니다.

int function(int a)

너비가 2 바이트 function@2이므로으로 맹 글링되었습니다 int. 선언과 정의가 일치하지 않으면 링커가 런타임에 스택을 손상시키지 않고 함수를 찾지 못합니다. 반대로, 프로그램이 연결되면 호출이 끝날 때 스택에서 올바른 바이트 수가 팝되는지 확인할 수 있습니다.

32 비트 Windows 이상에서는 stdcallABI를 대신 사용하십시오 . 푸시 순서는 C에서와 마찬가지로 오른쪽에서 왼쪽으로 파스칼 ABI와 유사합니다. Pascal ABI와 마찬가지로 이름 맹 글링은 스택 손상을 피하기 위해 인수 바이트 크기를 함수 이름으로 엉망으로 만듭니다.

여기 다른 곳에서 만든 클레임과 달리 C ABI는 Visual Studio에서도 함수 이름을 엉망으로 만들지 않습니다. 반대로 stdcallABI 사양으로 장식 된 맹 글링 기능 은 VS 고유하지 않습니다. GCC는 Linux를 컴파일 할 때도이 ABI를 지원합니다. 이것은 Wine 에 의해 광범위하게 사용되며 , 자체 컴파일 된 로더를 사용하여 Linux 컴파일 된 바이너리를 Windows 컴파일 된 DLL에 런타임 링크 할 수 있습니다.


9

C ++ 컴파일러는 서명이 다른 오버로드 된 함수에 고유 한 심볼 이름을 허용하기 위해 이름 맹 글링을 사용합니다. 기본적으로 인수 유형을 인코딩하여 함수 기반 수준에서 다형성을 허용합니다.

C는 함수의 과부하를 허용하지 않기 때문에 이것을 요구하지 않습니다.

이름 맹 글링은 'C ++ ABI'에 의존 할 수없는 이유 중 하나 일뿐입니다.


8

C ++은 C 코드와 연결되거나 연결되는 C 코드와 상호 작용할 수 있기를 원합니다.

C는 이름이 얽 히지 않은 함수 이름을 기대합니다.

C ++이이를 엉망으로 만들면 C에서 내 보낸 non-mangled 함수를 찾지 못하거나 C는 내 보낸 C ++ 함수를 찾지 못합니다. C 링커는 C ++에서 오는지 또는 C ++에서 오는지를 모르기 때문에 예상되는 이름을 가져와야합니다.


3

C 함수와 변수의 이름을 조정하면 링크 타임에 유형을 확인할 수 있습니다. 현재 모든 (?) C 구현을 사용하면 한 파일에서 변수를 정의하고 다른 파일에서 함수로 호출 할 수 있습니다. 또는 서명이 잘못된 함수를 선언 한 void fopen(double)다음 호출 할 수 있습니다.

1991 년에 다시 mangling을 사용하여 C 변수와 함수의 형식 안전 연결을위한 체계를 제안 했습니다. 다른 체계에서 언급했듯이이 체계는 이전 버전과의 호환성을 파괴하기 때문에 채택되지 않았습니다.


1
" 링크 타임에 해당 유형을 확인하도록 허용"을 의미 합니다. 컴파일 타임에 유형 확인하지만 엉킨 이름으로 연결하면 다른 컴파일 단위에 사용 된 선언이 일치하는지 확인할 수 없습니다. 동의하지 않으면 기본적으로 고장이 나고 수정해야하는 빌드 시스템입니다.
cmaster-monica reinstate
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.