2010-09-15 12 views
8

Ich habe einige C-Code, den ich nach C++ portieren muss. Der Code hat eine StrukturForward Deklarationen für Variablen?

struct A { 
    ... 
    struct A * myPtr; 
} 

Und nun zwei globale Arrays deklariert sind und wie diese initialisiert:

//Forward declaration of Unit 
struct A Unit[10]; 

struct A* ptrUnit[2] = { Unit, Unit+7 }; 
struct A Unit[10] = { { .., &ptrUnit[0] }, 
         ... }; 

Jetzt, während dies in C funktioniert gut, es gibt einen Fehler in C++ (Variable neu deklariert). Sind Variablen nicht in C++ vorwärts deklariert?

Antwort

18

in C++ eine Variable Erklärung muss mit extern vorangestellt werden:

extern A Unit[10]; 

// ... 

A Unit[10] = { ... }; 

(. Beachten Sie, dass in C++ Sie die führende struct weglassen)

+2

Siehe [diese Antwort] (http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-declaration/1410632#1410632) für weitere Details zu Deklarationen und Definitionen. – sbi

+2

Ihre Aussage über 'den gleichen Namensraum' ist nicht vollständig korrekt. Eine 'struct A' Definition hat eine implizite' typedef struct A A' als Konsequenz, wenn der Bezeichner 'A' nicht im selben Bereich definiert ist. Etwas wie "struct A {...} A;" ist in C++ völlig legal, und dann bezieht sich "A" (ohne "struct") auf das Objekt. Dass dies möglich ist, bedeutet jedoch nicht, dass dies ein guter Stil ist. In POSIX haben Sie das beispielsweise mit der Header-Datei "sys/stat.h", die "struct stat" und die Funktion "stat" definiert. –

+1

@Jens: Ich bin mir nicht sicher über die rechtlichen Details, aber Sie scheinen einen Punkt zu haben. Ich habe meine Antwort entsprechend bearbeitet. – sbi

1

C allows Variablen tenatively deklariert werden (I vermuten). C++ nicht. Sobald 'Einheit' definiert wurde, kann sie nicht im selben Bereich neu definiert werden.

17

struct A Unit[10] ist keine Forward-Deklaration einer Variablen. Der Ausdruck "Forward-Deklaration" bezieht sich normalerweise auf nicht definierende Deklarationen, während struct A Unit[10] eine Definition ist. In Ihrem Code definieren Sie also Unit mehrmals in der gleichen Quelldatei. In C-Sprache ist es erlaubt, da in C-Definitionen ohne Initialisierer vorläufige Definitionen sind. Sie können mehrmals in der gleichen Übersetzungseinheit auftreten. In C++ gibt es keine vorläufige Definition. In C++ sind mehrere Definitionen immer illegal.

Wenn Sie eine echte Vorwärtsdeklaration für eine Variable wollen, müssen Sie das Schlüsselwort verwenden extern

extern struct A Unit[10]; 

Dies wird in C und C++ arbeiten. Als Nebeneffekt ergibt dies jedoch Unitexterne Verknüpfung. Wenn Sie eine Variable mit interne Verknüpfung benötigen, dann haben Sie Pech in C++, da in C++ es nicht möglich ist, eine Variable mit interner Verknüpfung weiterzuleiten. In der Zwischenzeit werden Ihnen die vorläufigen Definitionen helfen, dies zu erreichen.

+0

+1, antwort gut gesetzt – sellibitze