/ 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
Brug af forward typer?
Fra : Per Abrahamsen


Dato : 11-03-04 10:58

Et andet spørgsmål. Er følgende legalt?

struct Incomplete;

extern const Incomplete& foo ();

void bar ()
{ foo (); }

Spørgsmålet her er om "kast værdien væk" er en lovlig brug af en
ukomplet type?

Igen, VC++ bryder sig ikke om det, GNU/Intel/Borland syntes det er i orden.

 
 
Ivan Johansen (11-03-2004)
Kommentar
Fra : Ivan Johansen


Dato : 11-03-04 13:16

Per Abrahamsen wrote:
> Et andet spørgsmål. Er følgende legalt?
>
> struct Incomplete;
>
> extern const Incomplete& foo ();
>
> void bar ()
> { foo (); }
>
> Spørgsmålet her er om "kast værdien væk" er en lovlig brug af en
> ukomplet type?

Ja, det er helt legalt. Du kan bruge en ukomplet type så længe du ikke
har brug for at vide hvad der ligger i den eller hvor stor den er. Det
er derfor helt i orden at arbejde med pointere og referencer til
ukomplette typer. At du ignorerer returværdien er faktisk irrelevant.

Ivan Johansen


Per Abrahamsen (11-03-2004)
Kommentar
Fra : Per Abrahamsen


Dato : 11-03-04 13:53

Per Abrahamsen <abraham@dina.kvl.dk> writes:

> struct Incomplete;
>
> extern const Incomplete& foo ();
>
> void bar ()
> { foo (); }

Det er værd at bemærke at følgende virker:

struct Incomplete;

extern const Incomplete& foo ();

void bar ()
{ const Incomplete& dummy = foo (); }

Det er altså "smid væk" som kræver særlig information om objektet.

Mogens Hansen (11-03-2004)
Kommentar
Fra : Mogens Hansen


Dato : 11-03-04 20:50

"Per Abrahamsen" <abraham@dina.kvl.dk> wrote:
> Et andet spørgsmål. Er følgende legalt?
>
> struct Incomplete;
>
> extern const Incomplete& foo ();
>
> void bar ()
> { foo (); }
>
> Spørgsmålet her er om "kast værdien væk" er en lovlig brug af en
> ukomplet type?

Intuitivt ville jeg forvente at det er lovligt, også selv hvis returværdien
blev brugt f.eks. som parameter en til anden funktion.
Grunden til det synspunkt er at compileren ikke behøver at kende størrelsen
på objektet (kun størrelsen på en reference, som typisk er uafhængig af
typen den referer til) og den har ikke nogen brug for at oprette, nedlægge
objekter af typen Incomplete.


Men hvad siger Standarden ?

§8.3.5-6 - Functions
The type of a parameter or the return type for a function declaration that
is not a definition may be an incomplete class type.

Men det siger blot at erklæringen er i orden - ikke nødvendigvis brugen.

§5.2.2-4 - Function call
When a function is called, the parameters that have object type shall have
completely defined object type. [Note: this still allows a parameter to be
a pointer or reference to an incomplete class type. However, it prevents a
passedbyvalue parameter to have an incomplete class type. ]


Det beskriver kun funktions parametre, men siger også at
const Incomplete&
er en komplet type, selvom Incomplete ikke er det.

>
> Igen, VC++ bryder sig ikke om det, GNU/Intel/Borland syntes det er i
orden.

Igen er Comeau enig med gcc, Intel og Borland.
Her ville jeg bestemt ikke mene at der er grund (bortset fra defekte
compilere) til at undgå sådanne konstruktioner ud fra et design synspunkt.

Venlig hilsen

Mogens Hansen

Per Abrahamsen (12-03-2004)
Kommentar
Fra : Per Abrahamsen


Dato : 12-03-04 10:19

Mogens Hansen <mogens_h@dk-online.dk> writes:

> Intuitivt ville jeg forvente at det er lovligt, også selv hvis returværdien
> blev brugt f.eks. som parameter en til anden funktion.

Det sidste skulle meget gerne være lovligt, det er en gennemgående
konstruktion i al min C og C++ kode. Jeg anbefaler endda andre at
gøre det samme:

<http://www.dina.kvl.dk/~abraham/rants/opaque-pointer.html>

Spørgsmålet er om "smid væk" er en brug af "den type referencen
refererer til". Jeg kunne forestille mig VC++ gør noget i stil med:

void bar ()
{ Incomplete __compiler_generated_dummy = foo (); }

Evt. som led i en "return value optimization":

void bar ()
{
Incomplete __compiler_generated_dummy; // Generer returværdi på forhånd.
foo (__compiler_generated_dummy); // Giv foo det som særlig par.
(void) __compiler_generated_dummy; // Ignorer returværdien.
}

Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408186
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste