redefinition; different basic types

Tags:    c++

Hej
Jeg har et problem. Jeg får en fejlbesked i MSVC der fortæller mig at jeg har en redefinition af nogle basic types.
Det drejer sig om henholdsvis intptr_t der kan findes i MSVCs egen crtdefs.h og i et andet program jeg bruger der hedder csound sysdep.h

Jeg kan ikke lave nogle af dem om, så derfor skal jeg finde en måde at lade dem leve side om side. Jeg har fået et hint fra en hjælpsom gut:
Fold kodeboks ind/udKode 


Men jeg synes efterhånden jeg har prøvet lidt af hvert, uden succes. Der er nogle ting der forvirrer mig omkring det her. f.eks er intptr_t og uintptr_t i crtdefs.h defineret under _WIN64, men jeg bruger og compilerer til win32.
Jeg går også ud fra at det drejer sig om symbolet _INTPTR_T_DEFINED i crtdefs.h der skal indsættes i den ovenstående kode.

Enhver form for hjælp ville være meget tiltrængt og værdsat
Mvh
Carsten

Udpluk af crtdefs.h:
Fold kodeboks ind/udKode 

Udpluk af sysdep.h
Fold kodeboks ind/udKode 

build log:
Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 03.03.2008 19:33 af Bruger #12570
9 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato


Hej Carsten,

#ifdef _WIN64
typedef __int64 intptr_t;
#else
typedef _W64 int intptr_t;
#endif

dette betyder at intptr ALTID er defineret ;) Du må omdøbe det du har hvis filen skal inkluderes.

Med venlig hilsen
Ieet

Ps. Er ikke 100% sikker på at jeg forstod dine filer.





Du kan inkludere sysdep.h og definere _INTPTR_T_DEFINED inden crtdefs.h (eller andre Microsoft headers), dvs:

#include <sysdep.h>
#define _INTPTR_T_DEFINED
#include <windows.h>




Måske misforstår du mig, eller også forstår jeg ikke hvad du mener. Ihvertfald synes jeg der er stor forskel på den kode jeg fik af en anden herre og så det eksempel du gav.

Jeg prøver lige med nogle korte spørgsmål som gerne skulle dække min forvirring:

1. Når det er intptr_t og uintptr_t der bliver redefineret, er det så _INTPTR_T_DEFINED jeg skal indsætte i min eksempel kode? Eller er det intptr_t og uintptr_t?
_INTPTR_T_DEFINED er jo ikke tilstede i sysdep.h, kun i crtdefs.h - det vil sige i sysdep.h er intptr_t og uintptr_t ikke defineret i et symbol a la _INTPTR_T_DEFINED

2. Betyder det noget hvor jeg implementerer koden?

3. Kan du/i nikke genkendende til den eksempel kode jeg har fået og eventuelt forklarer mig hvad tankegangen bag er?
Det er ligesom man laver en ny version af symbolet hen over det gamle (øh, dårligt forklaret).

4. Hvorfor inkluderer du windows.h? Var det bare et eksempel?

Jeg tror det var det.
Jeg spørger meget, men jeg er også ret forvirret omkring det her, og har siddet fast længe. Håber det er ok.

Med venlig hilsen
Carsten



Den første stump kode (eksempel kode) du viser virker vist kun for #define's, dit problem stammer fra typedef's

Hvis du definerer _INTPTR_T_DEFINED inden den kode der typedef'er intptr_t skulle problemet gerne forsvinde.

Ja, windows.h var blot et eksempel.

Ja, det betyder noget hvor du implementerer koden.



Ok. jeg smed:

#include <sysdep.h>
#define _INTPTR_T_DEFINED

ind i crtdefs.h og det virkede fint. Synes bare det virkede lidt drastisk at ændre i windows header filer.

Jeg takker mange gange, og håber jeg får det til at virke alt i alt.

Mvh
Carsten

PS: nu gav jeg Ieet point. Jeg ved Bertel ihvertfald ikke er så interesseret på det område.



Indlæg senest redigeret d. 03.03.2008 20:43 af Bruger #12570
Jeg synes ikke du skal ændre i windows header filer, du burde kunne løse problemet ved at have koden (dine to linjer) i dine egne filer.



Hmm. problemet er bare at lige meget hvor jeg lægger de to linier kode så hjælper det ikke. Måske har det noget at gøre med den måde mit MSVC project er sat op. Måske inkluderer projektet de windows specifikke filer pr. automatik før det begynder at kompilerer?

Derudover gav uintptr_t mig også problemer, da det faktisk blev brugt andet steds i en MSVC header, der så klagede over at den typedef der var på uintptr_t var forkert (fordi jeg havde ændret med de 2 linier kode).

Carsten



Bruger du precompiled headers? Gennem stdafx.h?
Du skal måske lave samme trick for uintptr_t, hvordan ser koden for den ud i crtdefs.h?



Bruger du precompiled headers? Gennem stdafx.h[/code]
Det er ikke noget jeg har taget aktivt stilling til. Jeg er ret overbevist om at det gør jeg ikke.

Fold kodeboks ind/udKode 
t