2010-05-15 6 views
10

Ich habe Probleme beim Schreiben von C++ - Code, der eine Header-Datei für eine C-Datei verwendet. Insbesondere verwendet die Header-Datei einen Variablennamen genannt Klasse:Verwenden Sie die Schlüsselwortklasse als Variablenname in C++

int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_class, BPY_class_attr_check* class_attrs, PyObject **py_class_attrs); 

Dies funktioniert in C als Klasse als Schlüsselwort nicht genommen wird, aber in C++, Klasse. Also, gibt es irgendwie kann ich diese Header-Datei in eine C++ - Datei enthalten, oder habe ich kein Glück?

Vielen Dank.

+0

Wenn dieser Code nicht für die Analyse durch einen C++ - Compiler vorbereitet ist, seien Sie auf weitere Probleme vorbereitet. Wenn es sich beispielsweise um eine C lib handelt, mit der Sie eine Verknüpfung herstellen möchten, sollten alle Deklarationen in 'extern 'C eingeschlossen werden, damit der Linker weiß, dass er nach nicht gemanagten Symbolen suchen muss. – sbi

+0

Der Compiler wirft immer noch eine Anpassung, wenn ich das #include nur in ein externes "C" verpacke. Soll ich aaa's Trick in deinen einfügen? –

+0

Ich habe gerade festgestellt, dass dies ein Python-Header ist. Ich habe keine Ahnung, welchen Header Sie verwenden und wofür es verwendet wird, aber wissen Sie http://www.boost.org/doc/libs/1_43_0/libs/python/doc/index.html? – sbi

Antwort

9

versuchen, etwas wie folgt aus:

#define class class_variable 
// if class is only used in declarations, you can also do 
// #define class 
#include "c.h" 
#undef class 

es zu Problemen führen kann, aber vielleicht einen Versuch wert

Alternative (mit Makefile):

python_.hpp: /usr/include/python.h 
    perl -pe 's/\Wclass\W//g' $< > [email protected] 
... 

#include "python_.hpp" 
+0

Es hat funktioniert ... obwohl ich die Bibliotheken noch nicht verlinkt habe, vielen Dank. –

+0

@Leif viel Glück.Möglicherweise möchten Sie auch die vorverarbeitete Datei manuell überprüfen nur sicherstellen, dass keine unerwünschten Nebenwirkungen eingeführt wurden – Anycorn

+1

Wenn Sie einen der Header der Standardbibliothek verwenden, ist die Definition eines Makros mit einem Schlüsselwort als Name nicht zulässig (vgl. Http: // stackoverflow .com/questions/2726204/c-preprocessor-defining-ein-Schlüsselwort-ist-es-Standards-konforme. C ist in dieser Hinsicht etwas nachsichtiger als C++. –

3

Sie können immer #ifdef __cplusplus verwenden, um eine Erklärung spezifisch für C++ in diesem Header

+0

Da dies Teil eines größeren Code-Repository ist, sollte ich wahrscheinlich nicht in der Header-Datei selbst mucken. –

3

Sie müssen erstellen den Header ändern zu ersetzen ‚Klasse‘ mit etwas anderem, um sie als C++ zu kompilieren.

1

Als eine praktische Sache, Sie‘ kein Glück. "Klasse" ist ein reserviertes Wort, das Sie nicht als Variablenbezeichner verwenden können.

Ich nehme an, Sie Präprozessor Tricks tun könnte, wie

#define class othername 

Aber wirklich, das ist dumm, auch, weil es Ihren Code verwirrend werden und verhindern, dass Sie echte Klassen.

Fügen Sie einfach die Kugel und benennen Sie den Parameter 'theclass' oder etwas.

7

Wenn dies nur eine Deklaration ist, sind die Variablennamen überhaupt nicht relevant. Sie können sie vollständig entfernen oder sie ändern, wie Sie bitte. Dies liegt daran, die Erklärung lediglich den Namen und den Typ der Funktion definiert, die lautet:

int BPY_class_validate(const char *, PyObject *, PyObject *, 
         BPY_class_attr_check*, PyObject **); 

Aber wenn Sie die Namen wollen (ein bisschen mehr beschreibend sein), kann man einfach einen Unterstrich am Ende werfen Was Sie haben:

int BPY_class_validate(const char *class_type, PyObject *class_, 
         PyObject *base_class, BPY_class_attr_check* class_attrs, 
         PyObject **py_class_attrs); 

Dies wird keinen anderen Code brechen.

Verwandte Themen