이름 데코레이션
이름 장식은 대개 C++ 명명 체계를 지칭하지만 다른 여러 C 사례에도 적용될 수 있습니다. C++에서는 기본적으로 함수 이름, 매개 변수 및 반환 형식을 사용하여 함수의 링커 이름을 만듭니다. 다음 함수 선언을 고려합니다.
void CALLTYPE test(void);
아래 표에는 여러 호출 규칙에 대한 링커 이름이 나와 있습니다.
호출 규칙 | extern "C" 또는 .c 파일 |
.cpp , .cxx 또는 /TP |
---|---|---|
C 명명 규칙(__cdecl ) |
_test |
?test@@ZAXXZ |
빠른 호출 명명 규칙(__fastcall ) |
@test@0 |
?test@@YIXXZ |
표준 호출 명명 규칙(__stdcall ) |
_test@0 |
?test@@YGXXZ |
벡터 호출 명명 규칙(__vectorcall ) |
test@@0 |
?test@@YQXXZ |
C++에서 C 함수를 호출하는 데 사용합니다 extern "C"
. extern "C"
클래스가 아닌 C++ 함수에 대해 C 명명 규칙을 강제로 사용합니다. 컴파일러 스위치 /Tc 또는 /Tp에 유의하여 컴파일러에 파일 이름 확장을 무시하고 파일을 각각 C 또는 C++로 컴파일하도록 지시합니다. 이러한 옵션으로 인해 기대하지 않는 링커 이름이 발생할 수 있습니다.
함수 프로토타입의 매개 변수가 일치하지 않는 경우에도 이 오류가 발생할 수 있습니다. 이름 장식에서는 함수의 매개 변수가 데코레이트된 최종 함수 이름에 통합됩니다. 함수 선언의 매개 변수 형식과 일치하지 않는 매개 변수 형식을 사용하여 함수를 호출하면 LNK2001 발생할 수도 있습니다.
현재 컴파일러 공급업체 간 또는 다른 버전의 컴파일러 간에 C++ 명명에 대한 표준은 없습니다. 다른 컴파일러에서 컴파일된 개체 파일을 연결하면 동일한 명명 체계가 생성되지 않을 수 있으며 해결되지 않은 외부가 발생할 수 있습니다.