Hvordan spore opp årsaken til manglende struct fra inkludere filer i C?

stemmer
0

Jeg har en ganske stor prosjekt jeg porting, og i en av de mange overskriftene jeg har tatt med en fil som inneholder en struct definisjon for pmc_mdep. (Før i filen det bare erklært, men senere det er faktisk definert).

Prøver å kompilere det gir meg feil om at struct være en ufullstendig type (som jeg tror betyr at det mangler en definisjon).

Når jeg kjører preprosessor over denne prosjektet, gjør det inkluderer denne filen, men preprosessor produksjonen har ikke struct definisjon (men inkluderer enum-er fra denne filen).

Er det en metode for å finne ut hvorfor noen av en header fil blir til preprosessor utgang, og noen ikke?

TIA

(Også, dette er ikke den eneste kompilere feil, havnen er halvt gjort, men det bør være minst komme forbi denne delen)

Publisert på 01/07/2009 klokken 05:08
kilden bruker
På andre språk...                            


6 svar

stemmer
2

Jeg vanligvis bare spore tilbake fra konstruksjonen for å finne alle de omsluttende "#ifdef"og "#if"linjer som forprosessoren vil møte og se hvilken som styrer fjerning av strukturen fra inngangstrømmen inn i kompilatoren.

Som vanligvis fungerer ganske raskt for alle, men den mest hårete av header filer (dvs. de med svært mange nestet betingede Kompilerings- utsagn). For dem, jeg har vanligvis en titt på preprosessor utgang til å identifisere den siste linjen i tekstfilen som gjorde det til kompilatoren input stream.

Nesten helt sikkert neste linje vil være en betinget kompilering setning der du ikke har møtt tilstanden for inkludering.

For eksempel, hvis dette er topptekstfilen, ville du trenger å spore tilbake for å se at _KERNELskal defineres for å få erklæringen og definisjon.

Svarte 01/07/2009 kl. 05:16
kilden bruker

stemmer
1

Du sa:

Jeg har en ganske stor prosjekt jeg porting, og i en av de mange overskriftene jeg har tatt med en fil som inneholder en struct definisjon for pmc_mdep. (Før i filen det bare erklært, men senere det er faktisk definert).

Prøver å kompilere det gir meg feil om at struct være en ufullstendig type (som jeg tror betyr at det mangler en definisjon).

Denne feilen kan oppstå hvis du prøver å legge inn en pmc_mdeptil en annen struktur før du har definert en pmc_mdepfullt. Merk at du kan legge inn pekere til ufullstendige typer i strukturer, men ikke faktiske tilfeller av ufullstendig type.

Du kan også diskutere kjører preprosessor over filen som skal definere strukturen, og du ser enums danne header, men ikke strukturen definisjon. Det tyder på at kanskje du har en bortkommen kommentar som er å fjerne strukturen utilsiktet, eller kanskje du har strukturen definisjon innebygd mellom #ifdef XXXog #endifmen XXXer ikke definert når du gjør kompilering. Det kan også være #if 0.

Jeg vil kjøre C preprosessor på bare overskriften som inneholder strukturen definisjonen for å se hva som produserer; det vil være kortere enn å prøve å se på resultatet for hele programmet (kildefilen). Hvis jeg ikke kunne spot problemet raskt, vil jeg markere deler med noe sånt Stray enums å se hvilke som kommer gjennom og hvilke som ikke gjør det.

Svarte 01/07/2009 kl. 05:55
kilden bruker

stemmer
1

Jeg tror ikke at det er en bedre måte ved å sjekke preprosessor utgang vite hvorfor en fil er inkludert eller ikke. Her er gcc er preprosessor output format som kan hjelpe deg å forstå preprosessor sin utgang.

Også en annen måte du kan ha en prøve å sammenligne utgangene mellom at du er porting og den eksisterende.

Svarte 01/07/2009 kl. 05:39
kilden bruker

stemmer
1

Raymond Chen har et blogginnlegg om dette.

Du kan finne deg selv i en svingete labyrint av #ifdefs. Eller lurer du kanskje på hvorfor dine makroer ikke fungerer.

Jeg har disse linjene i min header filen:

#define MM_BUSY     0x0001
#define MM_IDLE     0x0002

men når jeg prøver å bruke dem, får jeg feil.

sample.cpp(23): error C2065: 'MM_BUSY': undeclared identifier
sample.cpp(40): error C2065: 'MM_IDLE': undeclared identifier

Noen ide hvorfor dette skjer?

Løsning: Bruk #errortil å spore opp problemet på samme måte som du ville spre printfrundt for å spore opp en vanlig feil.

Kilde: Bruk #errordirektiv for å sjekke om kompilatoren selv ser deg

Svarte 01/07/2009 kl. 05:19
kilden bruker

stemmer
1

Den mest sannsynlige årsaken er at det er en #define et sted rundt definisjonen. Siden det korresponderende symbolet ikke er definert eller definert til en annen verdi definisjonen ikke er inkludert, selv når toppteksten i seg selv er inkludert. Du må undersøke dette manuelt.

Svarte 01/07/2009 kl. 05:16
kilden bruker

stemmer
1

Jeg er redd det ikke; du blir nødt til å lete etter #ifdefs som omgir ditt område av interesse og spore opp hvorfor disse symbolene ikke er definert. Hvis det er porting til Linux / UNIX og du mangler ting fra standard overskrifter, har du kanskje ikke definert riktig _XOPEN_SOURCE eller _BSD_SOURCE i Makefile eller config.h.

Svarte 01/07/2009 kl. 05:15
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more