Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

06.07.2008, 23:10

Vorwärts-Deklarationen: Wie jetzt genau?

Guten Abend zusammen.
Ich versuche grad mein kleines Programm sinnvoll aufzuteilen und die Funktionen in eigene Dateien zu packen, welche dann separat compiliert werden.
Ich krieg das ganze irgendwie nicht richtig gebacken...

Ich habe verschiedene Strukturen angelegt, welche auch in diversen Funktionen zum Einsatz kommen. Nun war meine Überlegung die, das ich ein speparates File anlege - declarations.cpp - genannt, inwelchem alle definitionen der Struckturen drin stehen.
Wenn nun in einer Funktion eine dieser Strukturen bekannt sein muss, mache ich eine Vorwärts deklaration.

Quellcode

1
struct Meine_Struktur;

Nun funktioniert das dennoch nicht richtig.
"9 d:\daten\cpp\loadfile\source\function_createList.cpp invalid use of undefined type `struct TAG' "

Ausserdem ist mir nicht klar, wie ich eine enumeration (enum) quasi vorwärts-deklarieren kann.

Ich wäre dankbar, wenn ihr mir bisschen Licht ins Dunkel bringen könntet :>

Gruss neptun

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

06.07.2008, 23:21

Eine Vorwärtsdeklaration reicht nur aus, solange du nur einen Zeiger oder eine Referenz oder ähnliches auf ein Objekt vom entsprechenden Typ deklarieren willst.
Sobald du z.b. Objekte erstellen, by Value übergeben oder auf Member zugreifen willst (sobald eben der Compiler an der entsprechenden Stelle wissen muss wie jetzt das fragliche Objekt genau aussieht), brauchst du die komplette Deklaration der Klasse/Struktur/Union/etc.

Ein enum kannst du ganz normal mit

C-/C++-Quelltext

1
enum MyEnuM;


Vorwärtsdeklarieren. Allerdings wird das selten viel bringen, da du mit dem enum meistens irgendwas machen wirst wo die möglichen Werte des enum und ihre Namen bekannt sein müssen...

3

06.07.2008, 23:37

Ok, danke erstmal.
Eine Struktur doppel deklarieren darf man ja auch nicht. Wie kann man so ein Problem lösen? Muss man da mit Include-Guards arbeiten?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

06.07.2008, 23:45

Zitat von »"neptun"«

Ok, danke erstmal.
Eine Struktur doppel deklarieren darf man ja auch nicht. Wie kann man so ein Problem lösen? Muss man da mit Include-Guards arbeiten?


Exakt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#if defined _MSC_VER && _MSC_VER >= 1020 
#pragma once
#endif

#ifndef XXX_H
#define XXX_H

class foo{
};

#endif

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

07.07.2008, 08:42

Zitat von »"drakon"«

Zitat von »"neptun"«

Ok, danke erstmal.
Eine Struktur doppel deklarieren darf man ja auch nicht. Wie kann man so ein Problem lösen? Muss man da mit Include-Guards arbeiten?


Exakt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#if defined _MSC_VER && _MSC_VER >= 1020 
#pragma once
#endif

#ifndef XXX_H
#define XXX_H

class foo{
};

#endif


Schöner ist es wenn der Includeguard tatsächlich die komplette Datei umfasst:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
#ifndef XXX_H
#define XXX_H

#pragma once

class foo
{
};

#endif // XXX_H


In deiner Variante ist auch unschön, die Beschränkung auf Microsoftcompiler.
@D13_Dreinig

Beliah

Treue Seele

Beiträge: 115

Wohnort: Söhlde - LK Hildesheim

Beruf: FI-Anwendungsentwicklung

  • Private Nachricht senden

6

07.07.2008, 13:09

Zitat von »"David_pb"«


[...]
Schöner ist es wenn der Includeguard tatsächlich die komplette Datei umfasst:
[...]


Tut der doch. Und da, soweit ich weis, #pragma once - dass, auch mehr machen soll als "normale" include guards- nur bei Microsoft Compilern verfügbar ist kann man doch vorher abfragen ob es ein MS-Compiler ist der gerade die Datei bearbeitet.
Debuggers don't remove bugs, they only show them in slow motion.

Google Suche ohne Werbung und Cookies: Scroogle

Derzeitige(s) Freizeitprojekt(e)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

07.07.2008, 13:34

Zitat von »"Beliah"«

Zitat von »"David_pb"«


[...]
Schöner ist es wenn der Includeguard tatsächlich die komplette Datei umfasst:
[...]


Tut der doch.


Nein, der Include-Guard umschließt bei drakon's Version, klar ersichtlich, nicht den kompletten Dateiinhalt (#pragma once kommt bei ihm noch davor). Das geht natürlich, aber schöner ist es, wenn vor dem Include-Guard nichts mehr kommt. Das hat z.B. den Vorteil das der Präprozessor, bei Compilern die #pragma once nicht unterstützen, die #pragma Direktive nicht immer wieder auswerten muss.

Zitat von »"Beliah"«


Und da, soweit ich weis, #pragma once - dass, auch mehr machen soll als "normale" include guards- nur bei Microsoft Compilern verfügbar ist kann man doch vorher abfragen ob es ein MS-Compiler ist der gerade die Datei bearbeitet.


Pragma once ist kein Standard, richtig. Allerdings unterstützen auch andere, nicht Microsoft Compiler, dieses Feature. Daher macht ein Abfragen eigentlich keinen Sinn sondern schränkt nur unnötig ein.
@D13_Dreinig

Beliah

Treue Seele

Beiträge: 115

Wohnort: Söhlde - LK Hildesheim

Beruf: FI-Anwendungsentwicklung

  • Private Nachricht senden

8

07.07.2008, 13:42

Ok, das es das auch bei anderen Compilern gibt wusste ich nicht. Dann macht es natürlich auch mehr Sinn das innerhalb der normalen Include Guards zu packen.

Edit:
Wenn das stimmt was hier steht müsste dann nicht das Pragma vor den Include Guards stehen damit es richtig funktioniert?
Debuggers don't remove bugs, they only show them in slow motion.

Google Suche ohne Werbung und Cookies: Scroogle

Derzeitige(s) Freizeitprojekt(e)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

07.07.2008, 18:29

Zitat von »"David_pb"«


Nein, der Include-Guard umschließt bei drakon's Version, klar ersichtlich, nicht den kompletten Dateiinhalt (#pragma once kommt bei ihm noch davor). Das geht natürlich, aber schöner ist es, wenn vor dem Include-Guard nichts mehr kommt. Das hat z.B. den Vorteil das der Präprozessor, bei Compilern die #pragma once nicht unterstützen, die #pragma Direktive nicht immer wieder auswerten muss.


Hmm. Ich habe mir das eben so vorgestellt, dass, wenn ich die Vorteil von #pragma haben will (schnelleres compilen), dann sollte das ja vorher stehen, weil sonst ja sowieso zuerst die normalen Includeguards ausgewertet werden und #pragma once gar nicht zum Zuge kommt. Habe das aber nie getestet.


Zitat von »"David_pb"«


Pragma once ist kein Standard, richtig. Allerdings unterstützen auch andere, nicht Microsoft Compiler, dieses Feature. Daher macht ein Abfragen eigentlich keinen Sinn sondern schränkt nur unnötig ein.


Hmm. Dann kann man sich die #ifndef's auch gleich sparen?! :roll:

EDIT:
Ok. Die Datei wird nur einmal geöffnet, dann spielt die Reihenfolge eigentlich keine Rolle, ausser natürlich in dem Fall, welchen David bereits angesprochen hat.
http://msdn.microsoft.com/en-us/library/4141z1cx(VS.71).aspx

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

10

07.07.2008, 19:07

Ich wusste garnicht, dass #pragma once auch von GCC unterstützt wird. Praktisch, praktisch. Include Guards sind ne nervige Sache find ich ;)

Werbeanzeige