Используйте ключевое слово class как имя переменной в C ++ - PullRequest
10 голосов
/ 15 мая 2010

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

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 ++, или мне не повезло?

Спасибо.

Ответы [ 5 ]

9 голосов
/ 15 мая 2010

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

#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"
7 голосов
/ 15 мая 2010

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

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 голосов
/ 15 мая 2010

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

3 голосов
/ 15 мая 2010

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

1 голос
/ 15 мая 2010

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

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

#define class othername

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...