Использовать ключевое слово class как имя переменной в С++

У меня возникли проблемы с написанием кода на С++, который использует файл заголовка, предназначенный для файла C. В частности, файл заголовка использовал имя переменной, называемое классом:

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

Это работает в C, поскольку класс не рассматривается как ключевое слово, но в С++ класс есть. Так или иначе, я могу # включить этот заголовочный файл в файл С++, или мне не повезло?

Спасибо.

Ответ 1

попробуйте что-то вроде этого:

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

это может вызвать проблемы, но, возможно, стоит сделать снимок

альтернативный (с помощью Makefile):

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

#include "python_.hpp"

Ответ 2

Если это только объявление, имена переменных вообще не имеют значения. Вы можете полностью удалить их или изменить их, как вам угодно. Это связано с тем, что в декларации просто определяется имя и тип функции:

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

Но если вы хотите, чтобы имена (были немного более описательными), вы можете просто выделить подчеркивание в конце того, что у вас есть:

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

Это не нарушит какой-либо другой код.

Ответ 3

Вы всегда можете использовать #ifdef __cplusplus для создания объявления, специфичного для С++ в этом заголовке

Ответ 4

Вам нужно будет изменить заголовок, чтобы заменить "класс" на что-то еще, чтобы скомпилировать его как С++.

Ответ 5

Как практический вопрос, вам не повезло. "class" - это зарезервированное слово, вы не можете использовать его как идентификатор переменной.

Я предполагаю, что вы могли бы использовать препроцессорные трюки, например

#define class othername

Но на самом деле это глупо, потому что это сделает ваш код запутанным и помешает вам использовать реальные классы.

Просто укусите пулю и переименуйте параметр "theclass" или что-то еще.