Разумевање основа
Када је у питању позивање Ц++ функција из Ц и коришћење Ц++ објеката, потребно је размотрити неколико кључних елемената:
Позивање на Ц++ класе у Ц
Уобичајени приступ референцирању Ц++ класа у Ц-у укључује коришћење показивача на класе које се могу пренети између Ц и Ц++ кода.
Име Мангле
Да бисте спречили промене имена које могу утицати на препознавање у Ц-у, кључно је да имена буду доследна. Ово осигурава да Ц може исправно да идентификује и користи функције и објекте.
Датотека заглавља за двоструку намену
Датотека заглавља игра кључну улогу, служећи двострукој сврси и за Ц и за Ц++. Укључује дефиниције класа које Ц++ препознаје и инкапсулира функције приступа за Ц.
Како позвати Ц++ са Ц
За позивање Ц++ функција из Ц-а, екстерна „Ц“ декларација је кључна. Када се примени на Ц++ функције, обезбеђује да се имена функција третирају у Ц стилу (користећи Ц-везу) током процеса компилације. Ц не препознаје карактеристике Ц++-а као што су преоптерећење функција и мењање имена до којих може доћи током Ц++ компилације. Користећи екстерни „Ц“, Ц++ компајлер генерише имена функција која се придржавају Ц конвенција, омогућавајући беспрекорну интероперабилност. Ова декларација обезбеђује стандардизовани интерфејс, омогућавајући Ц коду да приступи и користи Ц++ функције без наиласка на сукобе имена или проблеме са компатибилношћу. Следе примери позивања Ц++-а из Ц-а. Да бисмо разумели како ова комбинација функционише, погледајмо пажљивије инстанце.
Практични примери: Израчунајте површину круга позивањем Ц++ из Ц
У овом једноставном примеру, упутићемо вас како можете израчунати површину круга позивањем Ц++ функције у Ц. Овај код се састоји од датотеке заглавља (цирцле.х) и датотеке имплементације (цирцле.цпп). Први део кода укључује екстерну Ц декларацију у датотеци заглавља. Погледајте следећи код. Затим, хајде да разрадимо сваки ред кода појединачно:
#ифндеф ЦИРЦЛЕ_АРЕА#дефине ЦИРЦЛЕ_АРЕА
екстерн 'Ц' {
дупло израчунати_ЦАреа ( дупло рад ) ;
}
#ендиф
дупло Цирцле_ЦАреа ( дупло рад ) {
повратак 3.14159 * рад * рад ;
}
Хајде да поделимо сваки део:
#ифндеф ЦИРЦЛЕ_АРЕА и #дефине ЦИРЦЛЕ_АРЕА
Ове линије су део инцлуде гуардс-а који обезбеђује да садржај датотеке заглавља буде укључен само једном у процесу компилације. Ако ЦИРЦЛЕ_АРЕА није дефинисан, следећи код ће бити укључен и ЦИРЦЛЕ_АРЕА ће бити дефинисан.
екстерн 'Ц'Ова синтакса се користи за декларисање да следећа функција има Ц везу. Ово је неопходно када пишете код који ће бити позван и из Ц и из Ц++.
дупло израчунати_ЦАреа ( дупло рад ) ;Ова линија декларише функцију под називом „цалцулате_Цареа“ која узима двоструки аргумент (рад) и враћа дупли аргумент.
Екстерна „Ц“ декларација у датотеци заглавља обавештава компајлер да користи везу у стилу Ц за функцију, чинећи је позвати из Ц кода. Користите овај код да пронађете област круга тако што ћете је сачувати у „цирцле.х“ датотеци. Када сачувате ову датотеку заглавља, све што треба да урадите је да је укључите као датотеку заглавља у Ц++ програм и извршите жељену функцију. Следи Ц код који израчунава површину круга. Датотека „маин.ц“ укључује Ц++ заглавље и директно позива „Цирцле_Цареа“. Погледајте следећи код:
#инцлуде 'цирцле.х'инт главни ( ) {
дупло радс = 5.0 ;
дупло области = Цирцле_ЦАреа ( радс ) ;
принтф ( „ Област круга је: %.2ф \н ' , области ) ;
повратак 0 ;
}
Овај једноставан Ц програм израчунава и штампа површину круга користећи функцију која је дефинисана у претходној датотеци под називом „цирцле.х“. Хајде да разложимо код:
#инцлуде 'цирцле.х'Овај ред укључује садржај датотеке заглавља „цирцле.х“ у програму. Датотека заглавља вероватно садржи декларације функција или макрое који су повезани са прорачунима кругова.
инт главни ( ) {Извршење програма почиње са главном функцијом, улазном тачком за Ц програме.
дупло радс = 5.0 ;Променљива радс типа доубле је декларисана и додељена јој је вредност 5.0. Ова променљива вероватно представља полупречник круга.
дупло области = Цирцле_ЦАреа ( радс ) ;Функција под називом „Цирцле_Цареа“ се позива са радијусом радс као аргументом и резултат се чува у променљивој области.
принтф ( „Површина круга је: %.2ф \н ' , области ) ;Резултат се штампа на конзоли помоћу „принтф“. Низ „Област круга је: %.2ф\н“ је стринг формата са чуваром места „%ф“ за вредност површине. „.2“ у „%.2ф“ означава да се приказују само две децимале.
повратак 0 ;Главна функција се завршава враћањем 0 што указује на успешно извршење програма у оперативном систему.
Укратко, датотека заглавља декларише функцију са Ц везом, а имплементациони фајл дефинише логику за израчунавање површине круга. Ово раздвајање омогућава да се код користи у Ц и Ц++ програмима. Погледајте излаз кода који је дат на следећој слици:
Као што можете видети на излазу, израчуната површина круга је 78,54 што је израчунавање површине = 3,14 * 5 * 5 = 78,54. Функција за израчунавање површине је дефинисана у датотеци заглавља “цирцле.х” која се затим позива у Ц++ датотеци уз помоћ екстерна “Ц”.
Закључак
У овом водичу смо вас водили кроз процес интеграције Ц++-а у ваше Ц програме. Интеграција Ц++ функционалности у Ц кодне базе захтева пажљиво разматрање показивача, мењања имена и датотека заглавља двоструке намене. Наведени примери илуструју практичан приступ постизању ове интеграције. Сада када сте видели како да повежете ова два програмска језика, имате више алата. Откључавање моћи Ц++-а док радите са Ц-ом могло би вашим пројектима дати потпуно нови ниво функционалности.