Decoração do nome
Decoração de nome geralmente se refere a convenções de nomenclatura do C++, mas pode ser aplicadas a um número de casos de C também. Por padrão, o C++ usa o nome da função, parâmetros e tipo de retorno para criar um nome de vinculador para a função. Considere a seguinte função:
void CALLTYPE test(void)
A tabela a seguir mostra o nome do vinculador para várias convenções de chamada.
Convenção de chamada |
extern "C" ou. c arquivo |
. cpp,. cxx ou /TP |
---|---|---|
Convenção de nomenclatura de C (__cdecl) |
testar |
? test@@ZAXXZ |
Convenção de nomenclatura fastcall (__fastcall) |
@test@ 0 |
? test@@YIXXZ |
Convenção de nomenclatura padrão de chamada (__stdcall) |
_test@0 |
? test@@YGXXZ |
Convenção de nomenclatura Vectorcall (__vectorcall) |
Test@@0 |
? test@@YQXXZ |
Use extern "C" para chamar uma função C de C++. Extern "C" força o uso da convenção de nomenclatura de C para funções de C++ não seja da classe. Lembre-se de comutadores de compilador /Tc ou /TP, que instrui o compilador a ignorar a extensão de nome de arquivo e compilar o arquivo como C ou C++, respectivamente. Essas opções podem causar nomes que você não espera.
Ter protótipos de função que têm parâmetros incompatíveis também pode causar esse erro. Decoração de nome incorpora o nome decorado de função final os parâmetros de uma função. Chamando uma função com os tipos de parâmetro que não coincidem com aqueles na declaração de função também pode causar LNK2001.
Atualmente, há um padrão de nomeação entre fornecedores de compilador ou até mesmo entre versões diferentes de um compilador de C++. Arquivos de objeto compilados com outros compiladores de vinculação, portanto, talvez não produza o mesmo esquema de nomenclatura e, portanto, faz com que externos não resolvidos.