Используйте класс ключевого слова в качестве имени переменной в C++

Я испытываю затруднения при написании кода C++, который использует заголовочный файл, разработанный для файла 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, поскольку урок не посещается как ключевое слово, но в C++, класс. Так есть ли так или иначе, я могу #include этот заголовочный файл в файл C++ или являюсь мной не повезло?

Спасибо.

11
задан Leif Andersen 15 May 2010 в 18:11
поделиться

5 ответов

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

#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' $< > $@
...

#include "python_.hpp"
10
ответ дан 3 December 2019 в 04:12
поделиться

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

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);

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

8
ответ дан 3 December 2019 в 04:12
поделиться

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

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

#define class othername

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

Просто прикусите пулю и переименуйте параметр в «класс» или что-то в этом роде.

1
ответ дан 3 December 2019 в 04:12
поделиться

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

3
ответ дан 3 December 2019 в 04:12
поделиться

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

3
ответ дан 3 December 2019 в 04:12
поделиться