views:

245

answers:

5

I am having trouble writing C++ code that uses a header file designed for a C file. In particular, the header file used a variable name called class:

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

This works in C as class isn't taken as a keyword, but in C++, class is. So is there anyway I can #include this header file into a c++ file, or am I out of luck?

Thank you.

+2  A: 

You can always use #ifdef __cplusplus to create a declaration specific for C++ in that header

Axarydax
As this is part of a larger code repository, I probably shouldn't be mucking about in the header file itself.
Leif Andersen
+3  A: 

You will need to modify the header to replace 'class' with something else in order to compile it as C++.

James McNellis
+7  A: 

try something like this:

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

it may cause problems, but maybe worth a shot

alternative (using Makefile):

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

#include "python_.hpp"
aaa
It worked...although I haven't linked the libraries yet, thank you though.
Leif Andersen
@Leif good luck. May also want to manually inspect preprocessed file just make sure there were not any unwanted side effects introduced
aaa
If you use any of the standard library headers, defining a macro with a keyword as its name is not permitted (cf. http://stackoverflow.com/questions/2726204/c-preprocessor-define-ing-a-keyword-is-it-standards-conforming). C is a bit more lenient than C++ in this regard.
James McNellis
So what your saying is that those lines are illegal in newer versions of C++?
Leif Andersen
What it's saying is that those lines are illegal in C++ if the header include any standard header files, and that it will be illegal period in the next version of the C++ standard.
KTC
Ah, okay. Well the header file does #include <Python.h>, so perhaps I do need to find another way.
Leif Andersen
@Leif I think standard library refers to C++ library, rather than C. python.h is C only so you might be okay. alternatively, run header file through external preprocessor, for example m4 or Perl, this way C++ will never know
aaa
@KTC: Actually, the rules haven't changed in C++0x; I've fixed that answer to the other question so that it is correct. My apologies. @aaa: The C++ standard library includes the C standard library headers.
James McNellis
@James, okay, that makes more sense, I was wondering how many C classes would incorporate C++ libraries...but even though they are including standard libraries, it doesn't matter, just because the rules didn't change, yes?
Leif Andersen
No offense to @aaa, but @Leif: I strongly consider you don't do this answer. It's illegal in terms of the language, and completely unnecessary. Just change `class` to `class_` and be done with it.
GMan
@GMan no problem, I put Makefile/Perl rule in answer
aaa
If the header WAS made for C and not CPP, you also need to wrap it thus:extern "C" {#include "cheader.h"}
Chris Becke
+1  A: 

As a practical matter, you're out of luck. "class" is a reserved word, you can't use it as a variable identifier.

I suppose you could do preprocessor tricks, like

#define class othername

But really that's silly, too, because it'll make your code confusing and prevent you from using real classes.

Just bite the bullet and rename the parameter 'theclass' or something.

Larry Gritz
+5  A: 

If this is declaration only, then the variable names don't matter at all. You can completely remove them or change them how you please. This is because the declaration merely defines the name and type of the function, which is:

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

But if you want the names (to be a bit more descriptive), you can just throw an underscore at the end of what you have:

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

This won't break any other code.

GMan