데코레이트된 이름
C 및 C++ 프로그램의 함수, 데이터 및 개체는 내부적으로 데코레이트된 이름으로 표시됩니다. 데코레이팅된 이름은 개체, 데이터 또는 함수 정의를 컴파일하는 동안 컴파일러에서 만든 인코딩된 문자열입니다. 호출 규칙, 형식, 함수 매개 변수 및 기타 정보를 이름과 함께 기록합니다. 이름 맨글링이라고도 하는 이 이름 장식은 실행 파일을 연결할 때 링커가 올바른 함수와 개체를 찾는 데 도움이 됩니다.
데코레이팅된 명명 규칙은 다양한 버전의 Visual Studio에서 변경되었으며 다른 대상 아키텍처에서도 다를 수 있습니다. Visual Studio를 사용하여 만든 원본 파일과 올바르게 연결하려면 동일한 컴파일러 도구 집합, 플래그 및 대상 아키텍처를 사용하여 C 및 C++ DLL 및 라이브러리를 컴파일해야 합니다.
참고 항목
Visual Studio 2015 이상에서 빌드한 라이브러리는 Visual Studio 2022를 통해 이후 버전의 Visual Studio로 빌드된 애플리케이션에서 사용할 수 있습니다. 자세한 내용은 Visual Studio 버전 간의 C++ 이진 호환성을 참조하세요.
데코레이팅된 이름 사용
일반적으로 성공적으로 컴파일 및 연결되는 코드를 작성하기 위해 데코레이트된 이름을 알 필요가 없습니다. 데코레이트된 이름은 컴파일러 및 링커의 내부 구현 세부 정보입니다. 일반적으로 도구는 데코레이트되지 않은 형식으로 이름을 처리할 수 있습니다. 그러나 함수 이름을 링커 및 기타 도구로 지정할 때 데코레이트된 이름이 필요할 수 있습니다. 예를 들어 오버로드된 C++ 함수, 네임스페이스 멤버, 클래스 생성자, 소멸자 및 특수 멤버 함수와 일치하려면 데코레이트된 이름을 지정해야 합니다. 데코레이팅된 이름이 필요한 옵션 플래그 및 기타 상황에 대한 자세한 내용은 사용 중인 도구 및 옵션에 대한 설명서를 참조하세요.
함수 이름, 클래스, 호출 규칙, 반환 형식 또는 매개 변수를 변경하면 데코레이트된 이름도 변경됩니다. 이 경우 새 데코레이트된 이름을 가져오고 데코레이트된 이름이 지정된 모든 위치에 사용해야 합니다.
이름 장식은 다른 프로그래밍 언어 또는 다른 컴파일러를 사용하여 작성된 코드에 연결할 경우에도 중요합니다. 컴파일러에 따라 다른 이름 장식 규칙이 사용됩니다. 실행 파일이 다른 언어로 작성된 코드에 연결되면 내보낸 이름/가져온 이름이 호출 규칙과 일치하도록 주의해야 합니다. 어셈블리 언어 코드는 MSVC 데코레이팅된 이름과 호출 규칙을 사용하여 MSVC를 사용하여 작성된 소스 코드에 연결해야 합니다.
C++ 데코레이팅된 이름의 형식
C++ 함수에 대한 데코레이트된 이름에는 다음 정보가 들어 있습니다.
함수 이름입니다.
멤버 함수인 경우 함수가 멤버인 클래스입니다. 장식에는 함수를 포함하는 클래스를 묶는 클래스 등이 포함될 수 있습니다.
네임스페이스의 일부인 경우 함수가 속한 네임스페이스입니다.
함수 매개 변수 형식.
호출 규칙.
함수의 반환 형식입니다.
선택적 대상별 요소입니다. ARM64EC 개체에서
$$h
태그가 이름에 삽입됩니다.
함수 및 클래스 이름은 데코레이트된 이름으로 인코딩됩니다. 데코레이트된 이름의 나머지 부분은 컴파일러 및 링커에 대해 내부적인 의미가 있는 코드입니다. 데코레이트되지 않은 C++ 이름과 데코레이트된 C++ 이름의 예는 다음과 같습니다.
데코레이트되지 않은 이름 | 데코레이트된 이름 |
---|---|
int a(char){int i=3;return i;}; |
?a@@YAHD@Z |
void __stdcall b::c(float){}; |
?c@b@@AAGXM@Z |
C 데코레이팅된 이름의 형식
C 함수에 대한 장식 형식은 다음 표와 같이 선언에 사용되는 호출 규칙에 따라 달라집니다. C++ 코드가 링크로 선언될 때 사용되는 장식 형식이기도 합니다 extern "C"
. 기본 호출 규칙은 __cdecl
입니다. 64비트 환경에서 C 또는 extern "C"
함수는 호출 규칙을 사용하는 __vectorcall
경우에만 데코레이팅됩니다.
호출 규칙 | 장식 |
---|---|
__cdecl |
선행 밑줄(_ ) |
__stdcall |
선행 밑줄(_ ) 및 후행 기호()와 매개 변수 목록의 바이트 수(@ 10진수) |
__fastcall |
선행 및 후행 기호(@ ) 뒤에 매개 변수 목록의 바이트 수를 나타내는 10진수 |
__vectorcall |
2개의 후행 기호(@@ )와 매개 변수 목록의 10진수 바이트 |
C 링크가 있는 ARM64EC 함수의 경우(C로 컴파일되었든 사용 extern "C"
하든) #
데코레이팅된 이름 앞에 a가 추가됩니다.
데코레이팅된 이름 보기
데이터, 개체 또는 함수 정의나 프로토타입이 포함된 소스 파일을 컴파일하고 나서 기호 이름의 데코레이트된 형식을 가져올 수 있습니다. 프로그램에서 데코레이트된 이름을 검사하려면 다음 방법의 하나를 사용합니다.
목록을 사용하여 데코레이트된 이름 표시
(목록 파일 형식) 컴파일러 옵션이 소스 코드(
/FAs
)를 사용하여 어셈블리로/FA
설정된 데이터, 개체 또는 함수 정의 또는 프로토타입을 포함하는 소스 파일을 컴파일하여 목록을 생성합니다.예를 들어 개발자 명령 프롬프트에 입력
cl /c /FAs example.cpp
하여 목록 파일을example.asm
생성합니다.결과 목록 파일에서 세미콜론(
;
)으로PUBLIC
시작하고 끝나는 줄과 디코딩되지 않은 데이터 또는 함수 이름을 찾습니다. 세미콜론과 세미콜론 사이의PUBLIC
기호는 데코레이팅된 이름입니다.
DUMPBIN을 사용하여 데코레이트된 이름 표시
OBJ 또는 LIB 파일에서 내보낸 기호를 보려면 개발자 명령 프롬프트에 입력
dumpbin /exports <obj-or-lib-file>
합니다.데코레이트된 형식의 기호를 찾으려면 괄호 안에 있는 데코레이트되지 않은 이름을 찾습니다. 데코레이팅된 이름은 데코레이트되지 않은 이름 앞에 있는 동일한 줄에 있습니다.
장식되지 않은 이름 보기
undname.exe를 사용하여 데코레이트된 이름을 데코레이트되지 않은 형식으로 변환할 수 있습니다. 이 예제에서는 어떻게 작동하는지 보여 줍니다.
C:\>undname ?func1@a@@AAEXH@Z
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
Undecoration of :- "?func1@a@@AAEXH@Z"
is :- "private: void __thiscall a::func1(int)"