/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Mangling på eksporterede member methods i ~
Fra : Klaus Petersen


Dato : 07-06-04 10:37

Hej igen (nu har jeg 3 på stribe).

Jeg eksporterer en statisk funktion i min klasse til et shared object, men
g++ vælger at dekorere mit eksportnavn.

Jeg har prøvet at erklære den med extern "C" men det virker kun for globale
funktioner.

I Visual C++ ved jeg man kan lave en .def fil - men hvordan gør man det med
g++ ?

mvh.
Klaus.



 
 
Byrial Jensen (07-06-2004)
Kommentar
Fra : Byrial Jensen


Dato : 07-06-04 18:15

Klaus Petersen wrote:
> Hej igen (nu har jeg 3 på stribe).
>
> Jeg eksporterer en statisk funktion i min klasse til et shared object, men
> g++ vælger at dekorere mit eksportnavn.
>
> Jeg har prøvet at erklære den med extern "C" men det virker kun for globale
> funktioner.

Man kan ikke erklære funktioner i en struct i C, så det giver så vidt
jeg kan se ikke mening at erklære medlemsfunktioner for extern "C".

Hvad ville du også opnå ved det? Brugeren af din so-fil bliver også nødt
til at være skrevet i C++ for at kunne bruge medlemsfunktionen, og vil
derfor forvente et dekoreret navn.

Klaus Petersen (07-06-2004)
Kommentar
Fra : Klaus Petersen


Dato : 07-06-04 19:48

> Man kan ikke erklære funktioner i en struct i C, så det giver så vidt
> jeg kan se ikke mening at erklære medlemsfunktioner for extern "C".
>
> Hvad ville du også opnå ved det? Brugeren af din so-fil bliver også nødt
> til at være skrevet i C++ for at kunne bruge medlemsfunktionen, og vil
> derfor forvente et dekoreret navn.

Ikke nødvendigvis - funktionen erklæres statisk.

Men jeg synes bare det er langt pænere med statiske member metoder fremfor
globale funktioner.

I dette tilfælde får jeg også brug for attributter - skulle det være en
global funktion ville det betyde globale variabler, hvilket jeg kun ville
bruge, hvis der virkelig absolut slet overhovedet ikke var nogen anden
udvej.

Visual C++ kan gøre det ... kan det virkelige passe at g++ ikke kan?



Byrial Jensen (07-06-2004)
Kommentar
Fra : Byrial Jensen


Dato : 07-06-04 20:35

Klaus Petersen wrote:
>>Man kan ikke erklære funktioner i en struct i C, så det giver så vidt
>>jeg kan se ikke mening at erklære medlemsfunktioner for extern "C".
>>
>>Hvad ville du også opnå ved det? Brugeren af din so-fil bliver også nødt
>>til at være skrevet i C++ for at kunne bruge medlemsfunktionen, og vil
>>derfor forvente et dekoreret navn.
>
> Ikke nødvendigvis - funktionen erklæres statisk.

Hvad forskel skulle det gøre? Der findes heller ikke statiske
medlemsfunktioner i C.

> Men jeg synes bare det er langt pænere med statiske member metoder fremfor
> globale funktioner.

Hvorfor bruger du så ikke bare C++ hvor de findes, i stedet for at
forsøge en meningsløs extern "C"-erklæring? Dekorationer af navne i en
so-fil fungerer fint.

> I dette tilfælde får jeg også brug for attributter - skulle det være en
> global funktion ville det betyde globale variabler, hvilket jeg kun ville
> bruge, hvis der virkelig absolut slet overhovedet ikke var nogen anden
> udvej.
>
> Visual C++ kan gøre det ... kan det virkelige passe at g++ ikke kan?

Hvad er det Visual C++ kan? Lave en medlemsfunktion som kan bruges
direkte fra et C-program? Det er en umulighed for noget sådant findes
ikke i C.

Klaus Petersen (07-06-2004)
Kommentar
Fra : Klaus Petersen


Dato : 07-06-04 21:01

> > Ikke nødvendigvis - funktionen erklæres statisk.
>
> Hvad forskel skulle det gøre? Der findes heller ikke statiske
> medlemsfunktioner i C.

ja sorry - det er mig som vrøvler

> Hvorfor bruger du så ikke bare C++ hvor de findes, i stedet for at
> forsøge en meningsløs extern "C"-erklæring? Dekorationer af navne i en
> so-fil fungerer fint.

Ja men programmet der skal bruge mit objekt kender ikke til mine klasser og
"algoritmen" for dekoreringen - den kalder henter bare en pointer til en
funktion med et bestemt navn og kalder den.

Jeg har ikke mulighed for at ændre denne adfærd.

> Hvad er det Visual C++ kan? Lave en medlemsfunktion som kan bruges
> direkte fra et C-program? Det er en umulighed for noget sådant findes
> ikke i C.

Den kan eksportere medlemsfunktioner, der er erklæret static, under et C
navn (dvs. uden dekorationer), hvilket gør det muligt uden videre at kalde
den fra C.

Selvfølgelig, når en funktion erklæres static, har man kun adgang til de
statiske ting i objektet - men man opnår et fint tilhørsforhold mellem
klassen og funktionen - og beskytter desuden attributterne på objektet.

Der findes åbenbart ikke sådan en funktionlitet i g++, så jeg tror jeg laver
nogle globale funktioner, som ikke gør andet end at kalde metoderne på
klassen.

Det er vist det bedste jeg kan opnå.



Byrial Jensen (07-06-2004)
Kommentar
Fra : Byrial Jensen


Dato : 07-06-04 21:28

Klaus Petersen wrote:

>>Hvad er det Visual C++ kan? Lave en medlemsfunktion som kan bruges
>>direkte fra et C-program? Det er en umulighed for noget sådant findes
>>ikke i C.
>
> Den kan eksportere medlemsfunktioner, der er erklæret static, under et C
> navn (dvs. uden dekorationer), hvilket gør det muligt uden videre at kalde
> den fra C.

Det lyder ikke portabelt. Man kan ikke uden videre gå ud fra at globale
funktioner kaldes på samme måde som statiske medlemsfunktioner.

> Selvfølgelig, når en funktion erklæres static, har man kun adgang til de
> statiske ting i objektet - men man opnår et fint tilhørsforhold mellem
> klassen og funktionen - og beskytter desuden attributterne på objektet.

Hvad mener du egentlig med attributter? Jeg kender ikke noget begreb med
det navn i standard C eller C++.

GCC har en udvidelse så man ved hjælp af nøgleordet __attribute__ kan
erklære forskellige egenskaber ved objekter og funktioner, for eksempel
at en funktion ingen sideeffekter har eller at den aldrig returnerer.
Disse bruges af GCC til optimereringer og/eller tjek af koden. Men det
er næppe sådan noget du tænker på?

> Der findes åbenbart ikke sådan en funktionlitet i g++, så jeg tror jeg laver
> nogle globale funktioner, som ikke gør andet end at kalde metoderne på
> klassen.
>
> Det er vist det bedste jeg kan opnå.

Jeg er enig. Det ville jeg også gøre.

Klaus Petersen (07-06-2004)
Kommentar
Fra : Klaus Petersen


Dato : 07-06-04 22:14

> Hvad mener du egentlig med attributter? Jeg kender ikke noget begreb med
> det navn i standard C eller C++.

Det er muligt jeg roder lidt rundt i begreberne - så vidt jeg ved er
attributter (attributes), egenskaber (properties) aliaser for variabler
erklæret i klassens scope.



Kent Friis (07-06-2004)
Kommentar
Fra : Kent Friis


Dato : 07-06-04 21:58

Den Mon, 7 Jun 2004 20:48:16 +0200 skrev Klaus Petersen:
>> Man kan ikke erklære funktioner i en struct i C, så det giver så vidt
>> jeg kan se ikke mening at erklære medlemsfunktioner for extern "C".
>>
>> Hvad ville du også opnå ved det? Brugeren af din so-fil bliver også nødt
>> til at være skrevet i C++ for at kunne bruge medlemsfunktionen, og vil
>> derfor forvente et dekoreret navn.
>
> Ikke nødvendigvis - funktionen erklæres statisk.
>
> Men jeg synes bare det er langt pænere med statiske member metoder fremfor
> globale funktioner.

Hvordan skulle det overhovedet være muligt? Hvis du har:

static void a::doit();
static void a::doit(int);
statid void a::doit(char *);
static void b::doit();
static void b::doit(int);
static void b::doit(float);

Hvilken skal så kaldes, når C-programmet kalder doit()?

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Klaus Petersen (07-06-2004)
Kommentar
Fra : Klaus Petersen


Dato : 07-06-04 22:20

> static void a::doit();
> static void a::doit(int);
> statid void a::doit(char *);
> static void b::doit();
> static void b::doit(int);
> static void b::doit(float);
>
> Hvilken skal så kaldes, når C-programmet kalder doit()?

Man må gå udfra at overloading ikke er tilladt hvis man fjerner
dekoreringen.
Men jeg har ikke prøvet at "drille" visual c++ på den måde.

Jeg må nok også indrømme at jeg ikke helt aner hvordan det går til i visual
c++ - jeg mener, hvordan kan den afgøre præcis hvilken funktion der ønskes
eksporteret uden dekorering.

Det er i hvert fald fristende at kalde den funktionalitet i visual c++ for
et hack.



Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409076
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste