2010-05-15 3 views
10

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

спасибо.

+0

Если этот код не подготовлен для обработки синтаксическим компилятором C++, будьте готовы к большим проблемам. Например, если это C-библиотека, с которой вы хотите установить связь, все объявления должны быть завернуты в 'extern 'C", так что компоновщик знает, что ему нужно искать неподключенные символы. – sbi

+0

Компилятор все еще бросает подгонку, когда я просто завершаю #include в extern «C». Должен ли я включать трюк aaa внутри вас? –

+0

Я просто понял, что это заголовок Python. Я понятия не имею, какой заголовок вы используете и для чего он используется, но знаете ли вы http://www.boost.org/doc/libs/1_43_0/libs/python/doc/index.html? – sbi

ответ

9

попробовать что-то вроде этого:

#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" 
+0

Это сработало ... хотя я еще не связал библиотеки, спасибо. –

+0

@Leif удачи.Может также потребоваться вручную проверить предварительно обработанный файл, просто убедитесь, что не было никаких нежелательных побочных эффектов. – Anycorn

+1

Если вы используете какой-либо из стандартных заголовков библиотек, определение макроса с ключевым словом, так как его имя не разрешено (см. Http: // stackoverflow .com/вопросы/2726204/с-препроцессор -определения-кий-а-ключевое слово-это-это-стандарты, отвечающие требования). В этом отношении C немного мягче, чем C++. –

3

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

+0

Поскольку это часть более крупного репозитория кода, я, вероятно, не должен ошибаться в самом файле заголовка. –

3

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

1

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

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

#define class othername 

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

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

7

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

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

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

Смежные вопросы