Vorwärts Deklaration von Enum in C ++ in C definiert

8

Ich habe nach Vorwärtsdeklaration gesucht und keine Möglichkeit gesehen, meine Situation zum Laufen zu bringen. Also hier ist es:

1) Es gibt eine C-Header Datei, eine Exportschnittstelle für eine große Mehrkomponenten-Software, die einen enum typedef

enthält

"export.h":

%Vor%

2) Ein Teil des Codes, in C ++ , verwendet diesen Export.

"cpp_code.cpp":

%Vor%

"cpp_header.hpp":

%Vor%

Es liegt also auf der Hand, dass das Problem in cpp_head.hpp liegt, da es nichts über die Enumeration weiß.

Ich habe versucht, cpp_header.hpp hinzuzufügen

%Vor%

und es wird tatsächlich funktionieren. Warum funktioniert das also? Weil es eine C-artige Syntax hat ?! Jedenfalls wurde mir gesagt, dass ich das nicht tun soll ("es ist C ++, nicht C hier") von der oberen "Verwaltung".

Gibt es einen anderen Weg, um das überhaupt funktionieren zu lassen, basierend darauf, wie die Dinge derzeit miteinander verknüpft sind? Sie möchten keine Include-Dateien ändern / hinzufügen; "Enum-Klasse" ist nur C ++, richtig? Das Hinzufügen von "enum VM_TYPE" zu cpp_header.hpp führt zu einem Fehler bei der Neudefinition.

Irgendeine Idee? Danke.

    
Andrew 18.02.2014, 22:58
quelle

2 Antworten

1

In der speziellen Situation, die in Ihrer Frage beschrieben wird, müssen Sie die Deklaration überhaupt nicht weiterleiten. Alle Dateien, die du #include im Wesentlichen kopierst, werden in eine einzelne Übersetzungseinheit eingefügt, bevor die eigentliche Kompilierung beginnt, und da du #include "export.h" vor du #include "cpp_header.hpp" hast, wird es einfach funktionieren , denn zu dem Zeitpunkt, zu dem der Compiler die Definition von struct VM_INFO sieht, hat er die Definition von enum _VM_TYPE schon gesehen, also hast du kein Problem. Es gibt im Grunde keinen Unterschied zwischen dem Einfügen von "export.h" in "cpp_header.hpp" und dem Einbeziehen der beiden in "cpp_code.cpp" in dieser Reihenfolge, da Sie nach der Vorverarbeitung im Wesentlichen denselben Code haben. Alles, was Sie hier tun müssen, ist sicherzustellen, dass Sie Ihre Includes in der richtigen Reihenfolge erhalten.

Wenn Sie jemals #include "cpp_header.hpp" ohne einschließlich "export.h" in einer Übersetzungseinheit verwenden wollten, in der Sie auf die Mitglieder von struct VM_INFO zugreifen müssen (also nicht als unvollständiger Typ) eine Option), dann "export.h" ist einfach schlecht entworfen, und Sie sollten die Definition von allem, was Sie brauchen, getrennt in eine neue Kopfzeile. Wenn, wie die Kommentare nahelegen, dies absolut nicht möglich ist und ein suboptimales Design erforderlich ist, dann wäre Ihre nächste beste Alternative, zwei Versionen von "cpp_header.hpp" zu haben, eine, die einfach die Definition von enum _VM_TYPE wiederholt, und eins was nicht. Sie würden #include die erste Version in einer Übersetzungseinheit, wo Sie nicht auch #include "export.h" , und #include die zweite Version in einer Übersetzungseinheit, in der Sie tun. Offensichtlich führt jede Code-Duplizierung dieses Typs in der Zukunft zu Problemen.

Auch Namen, die mit einem Unterstrich und einem Großbuchstaben beginnen, sind immer in C reserviert, also sollten Sie sie nicht verwenden. Wenn eine zukünftige Version von C sich jemals dafür entscheidet, _VM_TYPE zu verwenden, dann werden Sie entweder eine veraltete Version von C verwenden oder all diesen Code-Bruch haben.

    
Paul Griffiths 19.02.2014, 04:49
quelle
0

Eine Enumeration kann keine Vorwärtsdeklarationen sein, da der Compiler die Größe der Enumeration kennen muss. Der zugrundeliegende Enumerator ist compilerspezifisch, normalerweise aber ein int. Kannst du das Enum einfach als int interpretieren?

"Ich könnte und liege oft falsch"

    
Burnt Toast 18.02.2014 23:24
quelle

Tags und Links