Decoração do nome
A decoração de nome geralmente se refere a convenções de nomenclatura C++, mas também pode se aplicar a vários casos C. Por padrão, o C++ usa o nome da função, os parâmetros e o tipo de retorno para criar um nome de vinculador para a função. Considere a seguinte declaração da 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 | arquivo extern "C" ou .c |
.cpp , .cxx ou /TP |
---|---|---|
Convenção de nomenclatura (__cdecl ) |
_test |
?test@@ZAXXZ |
Convenção de nomenclatura de chamada rápida (__fastcall ) |
@test@0 |
?test@@YIXXZ |
Convenção de nomenclatura de chamada padrão (__stdcall ) |
_test@0 |
?test@@YGXXZ |
Convenção de nomenclatura de chamada de vetor (__vectorcall ) |
test@@0 |
?test@@YQXXZ |
Use extern "C"
para chamar uma função C do C++. extern "C"
força o uso da convenção de nomenclatura C para funções C++ não de classe. Lembre-se das opções do compilador /Tc ou /Tp, que orientam 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 de vinculador que você não espera.
Ter protótipos de função que têm parâmetros incompatíveis também pode causar esse erro. A decoração de nome incorpora os parâmetros de uma função no nome final da função decorada. Chamar uma função com tipos de parâmetro que não correspondem aos da declaração de função também pode causar o erro LNK2001.
Atualmente, não há padrões para nomenclatura C++ entre fornecedores de compilador ou até mesmo entre versões diferentes de um compilador. Vincular arquivos de objeto compilados por outros compiladores pode não produzir o mesmo esquema de nomenclatura e pode causar externos não resolvidos.