Использовать ключевое слово 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" или что-то еще.