다음을 통해 공유


이름 데코레이션

이름 장식은 대개 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++ 명명에 대한 표준은 없습니다. 다른 컴파일러에서 컴파일된 개체 파일을 연결하면 동일한 명명 체계가 생성되지 않을 수 있으며 해결되지 않은 외부가 발생할 수 있습니다.

참고 항목

링커 도구 오류 LNK2001