Hvordan fikse feil med flere definisjoner av en funksjon i C ++

Hvordan fikse feil med flere definisjoner av en funksjon i C ++
I C ++ oppstår multiple Definition -feilen når en funksjon eller variabel har flere definisjoner i forskjellige kildefiler, noe som forårsaker feil under koblingsprosessen. Denne guiden gir en forståelse av årsaken til denne feilen og tilbyr løsninger for å fikse den.

Flere definisjonsfeil i C++

Når en funksjon eller variabel har flere definisjoner i forskjellige kildefiler, resulterer koblingsprosedyren i en feil med flere definisjoner. For å sikre programmets enhetlighet og nøyaktighet, forventer linkeren bare en definisjon på tvers av alle kildefiler.

Vanligvis ser feilen slik ut:

Feil: Flere definisjon av 'Funksjonsnavn'

Det er avgjørende for hver C ++ -utvikler å forstå denne feilen og vite hvordan du fikser den.

Faktorer som fører til flere definisjonsfeil i C++

Flere definisjonsfeil kan skje i C ++ -koden din av flere grunner som diskutert nedenfor:

1: Flere definisjoner av samme funksjon eller variabel i en kildefil

Hvis du tilfeldigvis definerer den samme funksjonen eller variabelen flere ganger i samme kildefil, vil du møte en feil med flere definisjoner.

2: Funksjon eller variabel definert i en overskriftsfil

Når en funksjon eller variabel er deklarert i en overskriftsfil og at overskriftsfilen refereres til av en rekke kildefiler, vil enhver kildefil som har en overskrift også inneholde en definisjon for funksjonen eller variabelen. Dette genererer feilen i flere definisjoner.

3: Deklarerer den samme funksjonen eller variabelen flere ganger i samme kildefil

Hvis du ved et uhell erklærer den samme funksjonen eller variabelen flere ganger i samme kildefil, vil du møte en feil med flere definisjoner når du kobler. Dette er fordi linkeren bare forventer en definisjon for hver funksjon eller variabel på tvers av alle kildefiler.

Løs feil med flere definisjoner av en funksjon i C++

Følgende teknikker kan brukes til å fikse flere definisjonsfeil i C ++:

1: Bruk funksjonsprototyper og eksterne variabler

En teknikk for å fikse flere definisjonsfeil i C ++ er å erklære en funksjon eller variabel ved hjelp av funksjonsprototyper eller eksterne variabler, i stedet for å spesifisere dem i en overskriftsfil. Ved å gjøre det vil funksjonen eller variabelen bare bli definert en gang i kildefilen, og dermed unngå feilen.

Følgende er en kodesyntaks for ovennevnte løsning.

// Overskrift.h
#ifndef header_h
#Define header_h
ekstern int sub (int num1, int num2);
#slutt om
// kilde.CPP
#include "header.h "
int sub (int num1, int num2)

return num1 - num2;

I syntaks ovenfor, funksjonen under er deklarert i overskriftsfilen ved hjelp av eksternt nøkkelord, som indikerer at den er definert andre steder. Den faktiske definisjonen blir deretter gitt i kildefilen. De #ifndef header_h og #Define header_h Linjer inkluderer vakter som sikrer at overskriftsfilen bare er inkludert i samme kildefil for å unngå å omdefinere funksjonen.

2: Bruk statiske funksjoner eller variabler

Hvis en funksjon eller variabel bare brukes i en kildefil, erklærer den som statisk. Dette begrenser omfanget til den nåværende kildefilen, og linkeren vil ikke vurdere det under kobling. Ved å gjøre det, sørger du for at funksjonen eller variabelen bare er definert en gang og ikke kan nås fra andre filer.

Å erklære en funksjon eller variabel som statisk begrenser omfanget til gjeldende kildefil og sikrer at den bare er definert en gang, noe som gjør koden din mer modulær og enklere å vedlikeholde

I tillegg, hvis du har flere funksjoner i forskjellige filer, kan du enkelt bruke dem i et hvilket som helst annet prosjekt.

Vurder følgende kodesyntaks som et eksempel:

// funksjoner.CPP
statisk int en gang_used_function ()

// ..

I syntaks ovenfor, “Statisk” Nøkkelord brukes til å definere en funksjon som heter “En gang_USED_FUNCTION”. Denne funksjonen kan bare nås i samme kildefil og kan ikke nås fra andre filer som er koblet til denne kildefilen. Dette sikrer at funksjonen bare er definert en gang og ikke kan endres eller får tilgang til ved et uhell fra andre deler av programmet.

3: Implementere inline -funksjoner

Vurder å bruke inline -funksjoner for ofte kalt, korte funksjoner. Dette vil eliminere behovet for en egen definisjon, ettersom kompilatoren kan erstatte funksjonsanropet med funksjonens kode direkte.

Vurder følgende kodesyntaks som et eksempel:

// Overskrift.h
inline int sub (int num1, int num2)

return num1 - num2;

I syntaks ovenfor brukes "inline" nøkkelordet til å definere en funksjon som kalles "sub", som tar to heltallsargumenter og returnerer forskjellen. Ved å definere denne funksjonen som inline, vil kompilatoren erstatte funksjonsanropet med den faktiske funksjonskoden på kompileringstidspunktet, og eliminere behovet for en egen funksjonsdefinisjon.

4: Bruk navneområder

Ved å bruke navneområder kan du forhindre at linkeren finner flere definisjoner med samme navn. Navneområdene gir en måte å gruppere relaterte erklæringer og definisjoner i et enkelt navngitte omfang, noe som gjør det lettere å organisere og administrere store kodebaser.

Vurder følgende kodesyntaks som et eksempel:

// source_code_1.CPP
namespace source_code_1

int sub (int num1, int num2)

return num1 - num2;


// source_code_2.CPP
namespace source_code_2

int sub (int num1, int num2)

return num1 - num2;

I syntaks ovenfor har to forskjellige kildefiler en funksjon som kalles “sub” med samme signatur. For å forhindre navngiving av konflikter, er hver funksjon definert i et eget navneområde: “source_code_1” og “source_code_2”. På denne måten kan funksjonene nås fra sine respektive navnefelt uten å forårsake navngivningskonflikter. Når du ringer funksjonen fra andre deler av kodebasen, må du spesifisere navneområdet for å indikere hvilken versjon av funksjonen du vil ringe.

Konklusjon

Når programmerere og utviklere definerer og bruker den samme funksjonen to ganger, blir systemet forvirret, noe som fører til den typiske feilen i flere definisjoner av C ++ -funksjoner. Fordi C ++ kan vise uventede feil og mangler i filer som ser ut til å være riktige, liker utviklere en dynamisk opplevelse med å jobbe med det. Derfor forklarte denne guiden de flere definisjonene av funksjonsfeil i C ++, leverte løsningen syntaks og feilsøkte feilen.