Важной концепцией С++ является безопасная с точки зрения стыковки типов компоновка. Компилятор и компоновщик должны рабо- тать согласованно, чтобы гарантировать правильность типов переда- ваемых между функциями аргументов. Процесс, называемый "корректи- ровкой имен" (name-mangling), обеспечивает необходимую информацию о типах аргументов. "Корректировка имени" модифицирует имя функ- ции таким образом, чтобы оно несло информацию о принимаемых функ- цией аргументах.
Когда программа пишется целиком на С++, корректировка имен происходит автоматически и прозрачно для программы. Однако, когда вы пишете ассемблерный модуль для последующей его компоновки с программой на С++, вы сами обязаны обеспечить корректировку имен в модуле. Это легко сделать, написав пустую функцию на С+ и ском- пилировав ее с ассемблерным модулем. Генерируемый при этом Borland С++ файл .ASM будет содержать исправленные имена. Затем вы можете их использовать при написании реального ассемблерного модуля.
Например, следующий фрагмент кода определяет четыре различ- ные версии функции с именем test:
void test() { }
void test( int ) { }
void test( int, int ) { }
void test( float, double ) { }
Если этот код компилируется с параметром -S, то компилятор создает на выходе файл на языке Ассемблера (.ASM). Вот как он выглядит (несущественные детали убраны):
; void test() @testSqv proc near push bp mov bp,sp popo bp ret @testSqv endp
; void test( int ) @testSqi proc near push bp mov bp,sp popo bp ret @testSqi endp
; void test( int, int ) @testSqii proc near push bp mov bp,sp popo bp ret @testSqii endp
; void test( float, double ) @testSqfd proc near push bp mov bp,sp popo bp ret @testSqfd endp